diff --git a/.circleci/config.yml b/.circleci/config.yml index 6b1a098..a645cac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 defaults: &defaults working_directory: ~/repo docker: - - image: circleci/node:12.16.1-browsers + - image: circleci/node:14.15.0-browsers jobs: build-bundle: <<: *defaults @@ -40,60 +40,28 @@ jobs: path: bundle/coverage/junit - store_artifacts: path: bundle/coverage - - run: - name: Upload Coverage Data to Codecov - command: bash <(curl -s https://codecov.io/bash) -F material,unittest + # disabled, since we upload codecov already via github actions + # - run: + # name: Upload Coverage Data to Codecov + # command: bash <(curl -s https://codecov.io/bash) -F material,unittest - run: name: Check for Test Failures command: if [ -f bundle/failure.marker ] ; then exit 127; else exit 0; fi - publish-bundle: - <<: *defaults - steps: - - checkout - - attach_workspace: - at: . - - run: - name: Add README to bundle - command: cp README.md bundle/README.md - - run: - name: Authenticate with NPM - command: cd bundle && echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc - - run: - name: Publish Blox Material - command: cd bundle && npm publish - build-site: - <<: *defaults - steps: - - checkout - - attach_workspace: - at: . - - restore_cache: - keys: - - v1-site-dependencies-{{ checksum "site/package-lock.json" }} - # fallback to using the latest cache if no exact match is found - - v1-site-dependencies- - - run: cd site && npm install - - run: cd site && npm run build - - save_cache: - paths: - - site/node_modules - key: v1-site-dependencies-{{ checksum "site/package-lock.json" }} - - persist_to_workspace: - root: . - paths: - - site/node_modules - - site/dist - - store_artifacts: - path: site/dist - deploy-site: - <<: *defaults - steps: - - checkout - - attach_workspace: - at: . - - run: - name: Deploying blox.src.zone/material - command: echo "The deploy-site job is not implemented yet!" + # publish-bundle: + # <<: *defaults + # steps: + # - checkout + # - attach_workspace: + # at: . + # - run: + # name: Add README to bundle + # command: cp README.md bundle/README.md + # - run: + # name: Authenticate with NPM + # command: cd bundle && echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc + # - run: + # name: Publish Blox Material + # command: cd bundle && npm publish --tag beta workflows: version: 2 @@ -109,26 +77,11 @@ workflows: filters: tags: only: /.*/ - - publish-bundle: - requires: - - test-bundle - filters: - tags: - only: /^v[0-9]+(\.[0-9]+)*([-].*)?$/ - branches: - ignore: /.*/ - - build-site: - requires: - - build-bundle - filters: - tags: - only: /^v[0-9]+(\.[0-9]+)*([-].*)?$/ - - deploy-site: - requires: - - test-bundle - - build-site - filters: - tags: - only: /^v[0-9]+(\.[0-9]+)*([-].*)?$/ - branches: - only: master + # - publish-bundle: + # requires: + # - test-bundle + # filters: + # tags: + # only: /^v[0-9]+(\.[0-9]+)*([-].*)?$/ + # branches: + # ignore: /.*/ diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..f27624d --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,41 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 14 +# Label to use when marking an issue as stale +staleLabel: stale + +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security + - on hold + +# Issues on a milestone will never be considered stale +exemptMilestones: true + +issues: + # Comment to post when marking an issue as stale. Set to `false` to disable + markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. + **If this issue is still relevant, please leave a comment** (for + example, "bump"), and we'll keep it open. Thank you for your contributions. + # Comment to post when closing a stale issue. Set to `false` to disable + closeComment: > + Closing this issue after a prolonged period of inactivity. If this + issue is still present in the latest release, please ask for it + to be reopened. Thank you! + +pulls: + # Comment to post when marking a pull request as stale. Set to `false` to disable + markComment: > + This pull request has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. + **If this pull request is still relevant, please leave a comment** (for + example, "bump"), and we'll keep it open. Thank you for your contributions. + # Comment to post when closing a stale pull request. Set to `false` to disable + closeComment: > + Closing this pull request after a prolonged period of inactivity. If this + pull request is still relevant in the latest release, please ask for it + to be reopened. Thank you! diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..779e5cb --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,150 @@ +name: Build, Test, Preview + +on: + push: + branches: + - master + tags: + - v[0-9]+.[0-9]+.[0-9]+ + - v[0-9]+.[0-9]+.[0-9]+-* + # note: not a regular expression! matches e.g. v1.0.12 or v2.1.0-beta.2 + pull_request: + +jobs: + build-bundle: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Use Node.js 14.15 + uses: actions/setup-node@v1 + with: + node-version: 14.15 + - uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node2-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node2- + - name: install dependencies + run: cd bundle && npm ci && cd ../site && npm ci + - name: Test + run: cd bundle && (npm run test:ci || touch failure.marker) + - name: Archive test results and coverage + uses: actions/upload-artifact@v2 + with: + name: bundlecoverage + path: bundle/coverage + - name: Upload Coverage Data to Codecov + uses: codecov/codecov-action@v1 + with: + file: ./bundle/coverage/lcov.info + flags: material,unittest + - name: Check for Test Failures + run: if [ -f ./bundle/failure.marker ] ; then exit 127; else exit 0; fi + - name: Build + run: cd bundle && npm run build + - name: Archive build artifacts + uses: actions/upload-artifact@v2 + with: + name: bundlebuild + path: | + bundle/apidocs + bundle/build + bundle/dist + publish-bundle: + runs-on: ubuntu-latest + needs: build-bundle + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/v') + steps: + - uses: actions/checkout@v2 + - name: Set up Use Node.js 14.15 + uses: actions/setup-node@v1 + with: + node-version: 14.15 + registry-url: https://registry.npmjs.org + - uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node2-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node2- + - name: install dependencies + run: cd bundle && npm ci && cd ../site && npm ci + - name: Download bundle build artifacts + uses: actions/download-artifact@v2 + with: + name: bundlebuild + path: bundle + - name: Set release tag + id: tag + run: echo ::set-output name=npm_tag::$(echo ${{ github.ref }} | grep -oP "(?<=\-)[a-zA-Z_]+[a-zA-Z0-9_]*" || echo latest) + - name: Publish @blox/material npm package + run: cd bundle && npm publish dist --tag ${{ steps.tag.outputs.npm_tag }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + build-site: + runs-on: ubuntu-latest + needs: build-bundle + steps: + - uses: actions/checkout@v2 + - name: Set up Use Node.js 14.15 + uses: actions/setup-node@v1 + with: + node-version: 14.15 + - uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node2-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node2- + - name: Download bundle build artifacts + uses: actions/download-artifact@v2 + with: + name: bundlebuild + path: bundle + - name: install depenencies + run: cd bundle && npm ci && cd ../site && npm ci + - name: Build + run: cd site && npm run build + - name: Create 404 page + run: cp site/dist/index.html site/dist/404.html + - name: delete dead link form-field until fixed + run: rm site/dist/components/form-field.html + - name: Archive build artifacts + uses: actions/upload-artifact@v2 + with: + name: sitebuild + path: | + site/dist + deploy-site: + runs-on: ubuntu-latest + needs: build-site + steps: + - uses: actions/checkout@v2 + - name: Download site build artifacts + uses: actions/download-artifact@v2 + with: + name: sitebuild + path: site/dist + - name: Deploy preview site + uses: FirebaseExtended/action-hosting-deploy@v0 + if: ${{ github.event_name == 'pull_request' }} + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLOX_36B2F }}' + expires: 7d + projectId: blox-36b2f + entryPoint: site + env: + FIREBASE_CLI_PREVIEWS: hostingchannels + - name: Deploy live site + uses: FirebaseExtended/action-hosting-deploy@v0 + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLOX_36B2F }}' + projectId: blox-36b2f + entryPoint: site + channelId: live + env: + FIREBASE_CLI_PREVIEWS: hostingchannels diff --git a/.gitignore b/.gitignore index f4da5bd..8003e46 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ /site/build/ /site/dist/ /site/node_modules/ +/site/.firebase/ /.project -/tmp \ No newline at end of file +/tmp diff --git a/.vscode/launch.json b/.vscode/launch.json index e221abc..cdd4d1c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,20 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "type": "chrome", + "request": "attach", + "name": "Chrome Attach", + "port": 9333, + "webRoot": "${workspaceFolder}/bundle", + "pathMapping": { + "/": "${workspaceFolder}/bundle", + "/base/": "${workspaceFolder}/bundle" + }, + "sourceMapPathOverrides": { + "webpack:///./*": "${webRoot}/*" + } + }, { "type": "chrome", "request": "launch", diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7c2631b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "bundle/node_modules/typescript/lib" +} \ No newline at end of file diff --git a/README.md b/README.md index 8a9cdc6..7c04fb7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - + Blox Material makes it possible to create beautiful Angular apps with modular and customizable UI components, designed according to the [Material Design Guidelines](https://material.io/design/guidelines-overview/). @@ -8,58 +8,27 @@ It integrates [Material Components for the Web](https://github.com/material-comp [![Follow Blox Material](https://img.shields.io/twitter/url/https/twitter.com/TheSourceZone.svg?style=social&label=Follow\+Blox\+Material)](https://twitter.com/intent/follow?screen_name=TheSourceZone) ## Quick Links - + [![npm](https://img.shields.io/npm/v/@blox/material.svg)](https://www.npmjs.com/package/@blox/material) [![License](https://img.shields.io/github/license/src-zone/material.svg)](LICENSE.txt) -[![CircleCI](https://img.shields.io/circleci/project/github/src-zone/material.svg)](https://circleci.com/gh/src-zone/material/tree/master) -[![Documentation](https://img.shields.io/badge/demo-website-lightgrey.svg)](https://blox.src.zone/material) -* [Documention, Demo & Examples](https://blox.src.zone/material) +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/src-zone/material/build)](https://github.com/src-zone/material/actions?query=workflow%3A%22Build%2C+Test%2C+Preview%22) +[![Codecov](https://img.shields.io/codecov/c/github/src-zone/material)](https://codecov.io/gh/src-zone/material) +[![Documentation](https://img.shields.io/badge/demo-website-lightgrey.svg)](https://material.src.zone/) +* [Documention, Demo & Examples](https://material.src.zone/) +* [Old Documention, Demo & Examples (for v0.x)](https://v0.material.src.zone/material) * [Changelog](https://github.com/src-zone/material/blob/master/bundle/CHANGELOG.md) * [News (via twitter)](https://twitter.com/TheSourceZone) +* [Guide for upgrading from v0.18.1 to v1.0.0](docs/migration/migration-0-to-1.md) -## Status +## Roadmap for 2.0.0 -Component | Documentation | --------------------- | --------- | -button | [docs & demo](https://blox.src.zone/material/components/button) | -card | [docs & demo](https://blox.src.zone/material/components/card) | -checkbox | [docs & demo](https://blox.src.zone/material/components/checkbox) | -chips | [docs & demo](https://blox.src.zone/material/components/chips) | -dialog | [docs & demo](https://blox.src.zone/material/components/dialog) | -drawer | [docs & demo](https://blox.src.zone/material/components/drawer) | -elevation | [docs & demo](https://blox.src.zone/material/components/elevation) | -fab | [docs & demo](https://blox.src.zone/material/components/fab) | -form-field | see docs & demo for e.g. [radio](https://blox.src.zone/material/components/radio), and [checkbox](https://blox.src.zone/material/components/checkbox) | -~~grid-list~~ | deprecated by the Material Components Web team | -icon-button | [docs & demo](https://blox.src.zone/material/components/icon-button) | -icon-toggle | [docs & demo](https://blox.src.zone/material/components/icon-toggle) | -linear-progress | [docs & demo](https://blox.src.zone/material/components/linear-progress) | -list | [docs & demo](https://blox.src.zone/material/components/list) | -menu | [docs & demo](https://blox.src.zone/material/components/menu) | -radio | [docs & demo](https://blox.src.zone/material/components/radio) | -ripple | [docs & demo](https://blox.src.zone/material/components/ripple) | -select | [docs & demo](https://blox.src.zone/material/components/select) | -slider | [docs & demo](https://blox.src.zone/material/components/slider) | -snackbar | [docs & demo](https://blox.src.zone/material/components/snackbar) | -switch | [docs & demo](https://blox.src.zone/material/components/switch) | -tabs | [docs & demo](https://blox.src.zone/material/components/tab) | -text-field | [docs & demo](https://blox.src.zone/material/components/text-field) | -toolbar | [docs & demo](https://blox.src.zone/material/components/toolbar) | -top-app-bar | [docs & demo](https://blox.src.zone/material/components/top-app-bar) | - -The following material-components-web packages provide styling (scss, css) only. As such they -can be consumed directly from your Angular app, and we see no reason to wrap their functionality -in Angular components or directives. Just use the styles and sass mixins as documented by the -material-components-web team: - -Package | Documentation | ----------------------| --------- | -image-list | [image-list documentation](https://github.com/material-components/material-components-web/blob/master/packages/mdc-image-list/README.md) | -layout-grid | [layout-grid documentation](https://github.com/material-components/material-components-web/blob/master/packages/mdc-layout-grid/README.md) | -shape | [shape documentation](https://github.com/material-components/material-components-web/blob/master/packages/mdc-shape/README.md) | -theme | [theme documentation](https://github.com/material-components/material-components-web/blob/master/packages/mdc-theme/README.md) | -typography | [typography documentation](https://github.com/material-components/material-components-web/blob/master/packages/mdc-typography/README.md) | +* Upgrade to material-components-web 9.0.0 +* Implement new components: `banner`, `circular-progress`, `data-table`, `segmented-button`, `tooltip`, + and `touch-target` +* Add angular schematics support to help with installation +* Add component alternatives to directives with complex structure +* Add autocomplete input component ## Building from source @@ -74,8 +43,8 @@ some tips: you must have built the material `bundle` first. * Check the `package.json` files for other commands that can be used to build, debug, test, release, or publish the library. -* Publishing a new bundle is handled by circleci. The commands for publishing/releasing a new +* Publishing a new bundle is handled by Github Actions. The commands for publishing/releasing a new version are in the root `package.json`. These commands create the appropriate tags and changes - that are picked up by the circleci build to do an actual publish/deploy/distribution of a new + that are picked up by a Github Action build to do an actual publish/deploy/distribution of a new version of the library. * Please use commit messages according to the [Angular Commit Message Guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-guidelines). diff --git a/bundle/.npmignore b/bundle/.npmignore deleted file mode 100644 index cf5e546..0000000 --- a/bundle/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -/tools/ -/build/ -/compiled/ -/apidocs/ -/coverage/ -/rollup.config.js -/tsconfig*.json -/karma.* diff --git a/bundle/CHANGELOG.md b/bundle/CHANGELOG.md index b1d2c76..0d86687 100644 --- a/bundle/CHANGELOG.md +++ b/bundle/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + + +# [1.0.0](https://github.com/src-zone/material/compare/v0.18.1...v1.0.0) (2021-02-03) + +### Features + +* All components are upgraded to material-components-web@5.1.0. See [Guide for upgrading from v0.18.1 to v1.0.0](docs/migration/migration-0-to-1.md) + +### BREAKING CHANGES + +* The minimal required Angular version is now v10.0.0 +* See [Guide for upgrading from v0.18.1 to v1.0.0](docs/migration/migration-0-to-1.md) + + + ## [0.18.1](https://github.com/src-zone/material/compare/v0.18.0...v0.18.1) (2020-07-14) diff --git a/bundle/NOTICE.txt b/bundle/NOTICE.txt index 5b00dbb..e09a564 100644 --- a/bundle/NOTICE.txt +++ b/bundle/NOTICE.txt @@ -6,6 +6,11 @@ (http://the.src.zone/), licensed under the Apache License Version 2.0. + The announce utility used in mdcChipSet is derived from + https://github.com/material-components/material-components-web/blob/master/packages/mdc-dom/announce.ts + This code is Copyright 2020 by Google Inc, and licensed + under the MIT-License. See src/utils/thirdparty.announce.ts + Portions of the code in tools/dgeni are derived from https://github.com/angular/material2/tree/2.0.0-beta.12/tools/dgeni Those portions are Copyright 2017 Google LLC, and licensed diff --git a/bundle/karma.conf.ts b/bundle/karma.conf.ts index 304a90c..c452f83 100644 --- a/bundle/karma.conf.ts +++ b/bundle/karma.conf.ts @@ -2,6 +2,7 @@ const path = require('path'); module.exports = (config) => { const isWatch = process.env.npm_lifecycle_script && process.env.npm_lifecycle_script.indexOf('--single-run false') !== -1; + const isHeadless = process.env.npm_lifecycle_event && process.env.npm_lifecycle_event.indexOf(':ci') !== -1; // Istanbul screws up typescript sourcemaps, so we have either sourcemaps to the typescript without coverage, // or coverage but sourcemaps go to transpiled typescript: console.log( @@ -11,6 +12,8 @@ module.exports = (config) => { 'typescript sourcemaps ARE available, but coverage IS NOT recorded' : 'typescript sourcemaps ARE NOT available, but coverage IS recorded' )); + if (isHeadless) + console.log('Running in Headless mode'); config.set({ basePath: '', @@ -126,7 +129,17 @@ module.exports = (config) => { logLevel: config.LOG_INFO, autoWatch: true, // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['Chrome'], + browsers: [isWatch ? 'ChromeDebugging' : (isHeadless ? 'ChromeHeadless' : 'Chrome')], + customLaunchers: isWatch ? { + ChromeDebugging: { + base: 'Chrome', + flags: ['--remote-debugging-port=9333'] + }, + ChromeHeadless: { + base: 'Chrome', + flags: ['--headless', '--disable-gpu', '--remote-debugging-port=9333'] + } + } : undefined, singleRun: true }); } diff --git a/bundle/package-lock.json b/bundle/package-lock.json index feb08b1..f5ab499 100644 --- a/bundle/package-lock.json +++ b/bundle/package-lock.json @@ -1,33 +1,68 @@ { "name": "@blox/material", - "version": "0.18.1", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular/animations": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.7.tgz", - "integrity": "sha512-74gY7onajmmnksy5E0/32bFv3B9NuWxV64kqD15YjGrh8AWe1BHt5enQI+rJ2tO8m2DKnwZsctis6k0Kcy+YKQ==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.0.4.tgz", + "integrity": "sha512-NI7UdLNdzTfLCDu0zVqwhdKq2z1flRsM2GCD9RHG/NRjlohh73uRTBW+BcYpfh+o+Wq4giiq8UkTIgS2ReqDGg==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/common": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.7.tgz", - "integrity": "sha512-B58YgxZva1DBaeayOBsaUOOkoyR+GRibuNC3gfOMm2vXeW9eCNX+jvDtw767GnKm2yGzIq8wB3x6GHojN00dPw==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.0.4.tgz", + "integrity": "sha512-4R2ALj71J6EAHVCKNnHHCKL7wcosMsv3gcMXbMTE+Wpzo3khEhM0Tej+I1qmMbVmGXVlRb//4+rjE4gff6FvQw==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/compiler": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.7.tgz", - "integrity": "sha512-hFpkuGpzxpK5h59LHHAjTFWsY6DCXZwgJFqvCuTPxWi/srvLGZRXrpC6Z1SlgHI9xxXaPfoa4uWw2VfA3BnqEg==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.0.4.tgz", + "integrity": "sha512-Smf8FKSjkqd522ZCdXjSnVv1lYA0b21AN3WC5L1mwtRwyl/VacqCA/YEklLneDGgI2FdSIC9+bzSQIV+CCVftA==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/compiler-cli": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.7.tgz", - "integrity": "sha512-+RXghex63v0Vi8vpQtDpWiqpAAnrTaN3bHT5fntRenq5+Ok5vL1MJ1mzbTmBXs2tuwTqNlwMm2AlZB7G/xcDMQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.0.4.tgz", + "integrity": "sha512-FV010O6GAldRe5sr+qegHe7oLinTylES70NX+0PIp44/W4tPx75Zvop+FVT90I4xPcvFvteLemy8nFAnMK+x5g==", "dev": true, "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", "canonical-path": "1.0.0", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -39,7 +74,8 @@ "semver": "^6.3.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "yargs": "13.1.0" + "tslib": "^2.0.0", + "yargs": "^16.1.1" }, "dependencies": { "convert-source-map": { @@ -62,116 +98,310 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true } } }, "@angular/core": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.7.tgz", - "integrity": "sha512-E9XZH5Dl+9MWG3MDC6wrKllhA8Rljpz66HOIeqKv2fHPed8kzuJZU3WJWLtbhDAXFwtGTyTZ4c82ZLSmqwTorg==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.0.4.tgz", + "integrity": "sha512-860cTMjdCHcvEsHOsTzpg5rThxwVgtnY4yT0SgboWiphrlzX+aNoyN/cCJHxWhmOTRlrl6/+hkeRq95E2BZkKw==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/forms": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.7.tgz", - "integrity": "sha512-PaHAmjMJDtg/3aGCPuq5BCRC1eZ/DBCpva9f7NrA1kqk0LcLdebm0v2uHwTOBtiz/VEgPvxiS4tXC4rjvUtfEg==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.0.4.tgz", + "integrity": "sha512-Fhfc4buwMZk0WumDvl/X7XBnOKFeTRTJrwKdi8LlhY6o1Og8H4e/f69u9iDJCF3YjU4qC6yGtPp9YpSVCPP7Ew==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/platform-browser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.7.tgz", - "integrity": "sha512-Por8omrEiSV2U/K2mm/Kuv+2R2rJkbAZ3ctEM6CWj9Y4Gz2akjOCxmEgWhhBeqdigcC3T1v707f52osf9jWBkg==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.0.4.tgz", + "integrity": "sha512-+uUCKJgspSghJ3R6Fk0XHA0tolbaRBi8JFS2cY+hi9s27WKB88peGvtsK6RCOPJONY6JdOuhpcZqRN8dKfPi7w==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/platform-browser-dynamic": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.7.tgz", - "integrity": "sha512-jwpyd93ofcRtchbayKD5v4GN4Lc7vbPe6dMUiwfnVnVAql0bOD/3YRI7w5qJ0Xx0sgQT+9Xo6jTXYnyUsZpEww==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.4.tgz", + "integrity": "sha512-ZOWTZaFfZSHhMy7a0RIxipiZoiobHWrGlq8/YaMrIgzUb9Fv518FeFCCI68BP0/GuyxX74MJmzv4ZgQctKKxXw==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/router": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.7.tgz", - "integrity": "sha512-uKru9F/Zju//gg6INl54abnlpLdEUUO/GpCfMk4zqu8LCZGNFta6OY7VT+9DK9Vdrh/XUD70oE9WoelcRwwTYA==", - "dev": true + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.0.4.tgz", + "integrity": "sha512-B0sqv8zMM6j88+udEZzO8wKBw61pHgWZmLopnAqA65rRPrAvMsvAHUnYqX6w5pYqhJQxCVLVeKM+0QlQh1+WnA==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, - "@babel/generator": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.0.tgz", - "integrity": "sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw==", + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, + "@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "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==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@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.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "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==", "dev": true }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -185,46 +415,46 @@ } }, "@babel/parser": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.0.tgz", - "integrity": "sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", "dev": true }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "globals": { @@ -234,9 +464,9 @@ "dev": true }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "ms": { @@ -248,20 +478,20 @@ } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" }, "dependencies": { "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "to-fast-properties": { @@ -272,397 +502,591 @@ } } }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@material/animation": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-0.34.0.tgz", - "integrity": "sha512-HKWU+pHda+xSIV0lwrTMOb/N005NIAV7+tvEEjTiLrQx74eO6J9nIjfCpZ0W4D8Kb9K90lgHFo0ZRC6yDTjizQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-5.1.0.tgz", + "integrity": "sha512-qZuPCZkTsCQCzx5EtY2eNBcmYOMGMbFVq6VTmvQztDCYDykT8JfP8Hpk55Y5bGORHvBbIasUXzoAhfQs6w/Bdg==", + "requires": { + "tslib": "^1.9.3" + } }, "@material/auto-init": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-0.35.0.tgz", - "integrity": "sha512-mrd6pZqPNdkuD78VwYhbgCrMob3Ws1rFttYunME+IcJzLeJWOtLLGe4xZe0kYrJJ6e0AZAEA+azLyokOwPQ3Fw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-5.1.0.tgz", + "integrity": "sha512-yal8Bo1cxGclFmXqg9l77PE34g1B3JS+YLBeGeZGXMsKrMcFV4105aipRPYujdKJsUS5eBFeskinJtOIo+gtUw==", + "requires": { + "@material/base": "^5.1.0", + "tslib": "^1.9.3" + } }, "@material/base": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-0.35.0.tgz", - "integrity": "sha512-PYuluVzcH8hxtionVvpTSygTENlgyOHvJ5ka7JfbCRQfXlxjV8zKYwhh9u/1HqA6y1OonG1oGFCaBHopbdsNEQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-5.1.0.tgz", + "integrity": "sha512-UxVFKpSNaoKqd7hHxy9hrvwANp0WJy/BZqu8Rj/aRvKnBZnuHehFuOysI9WqdeTqgveJaQoj6EEkVEqLurR5Sg==", + "requires": { + "tslib": "^1.9.3" + } }, "@material/button": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-0.37.0.tgz", - "integrity": "sha512-R0fpPCpl0dh3lbYbAK18tTx/rUAzUBihpRI+uh+//q2snPkZjG57F69zpl5UqA54KpzgFwbui/UFeA/prm+EbQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-5.1.0.tgz", + "integrity": "sha512-umeuIEbeRRd0cY+5axhrBoM0dvJ4YfoTsUbKgz4ctFxHLBsgthFUIXSa3Ot15s284UP6kjslK0LCMqzhirZxeQ==", "requires": { - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/density": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, "@material/card": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-0.37.0.tgz", - "integrity": "sha512-pBTomsmvPY07/Ecue74JvZjZ1k5uFo03X7jWU0ZYIULqdjq2PUQSDrz7KmZ6NVJhjOpquwsnqpZj1pnFLzpe9w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-5.1.0.tgz", + "integrity": "sha512-/syao6oR/PAvzs04quybeCWHZVn4W2dNnxIOWIJTRQced0/o3gYrHgQSX+edC+6pEnSr3Drwbo2cye7nRdbixA==", "requires": { - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0" } }, "@material/checkbox": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-0.37.0.tgz", - "integrity": "sha512-rQS1n63uVcKOTrrJ2S2NTq7MB3obGN/rD/tu5H62lXRoQcZq6MR16hU90ClX1DFpIqmJQAT9ONkx9by6FCmU9w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-5.1.0.tgz", + "integrity": "sha512-NwpWxFdWrZNlSjcSEEcGz8UN7ZQ5k8VthExclJnawpYGPUnCPLTXWogREnA2Tyl22PJ6jOy8Ejb8tnpu2rSiaw==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/chips": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-0.37.0.tgz", - "integrity": "sha512-16VL8f6VMLplHVStrI10JTJOVqVVXK9QI12BX+3LNLu44h/LUmxG4ovXIb0L3QTiBF8Nv5D6FK/PO/msRAs9YQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/checkbox": "^0.37.0", - "@material/ripple": "^0.37.0", - "@material/typography": "^0.35.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-5.1.0.tgz", + "integrity": "sha512-eYWrobENtXbnGoEx5BEURqoCfoc9aHu1JWq64mF12a/JSk+c035KYMjD4oyhow7dYqobbfQlWWdLQeHoRpYCeA==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/data-table": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-5.1.0.tgz", + "integrity": "sha512-vjijTvCHM7sfyPzQ05026nSWT1Bn/3lfj1u0oeYRnym6Ke6Os36x+IF/jFhjsraXKb2we6cof7OdoMFHCU8cqQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.10.0" + } + }, + "@material/density": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-5.1.0.tgz", + "integrity": "sha512-jmp6AgiNYosl+HicxWCa8vib9pg9tNxRcf+6f9LDkDYJ9jtO90PXuypyd0hO64JZ9Df7BywFj5hTWPERG1FBbw==" }, "@material/dialog": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-0.37.0.tgz", - "integrity": "sha512-Xnvnsbg6qOll+I+vNQvN+Rxk09JtwC8Q2UXByuIKkDVMBeOfVUKsdlw07GuH+A5yGhonV9dHP32FZUI5NHaAZA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-5.1.0.tgz", + "integrity": "sha512-CxA0W0uzXuwJNivB6Gbb7DvtJL3+J7ghsaSL1HfycXVXfdrT1nSidLyOIthRMVBUBJrAMfusvtzFDgXr0TWqDg==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-5.1.0.tgz", + "integrity": "sha512-tBbl3hG34Auv+2sboWhtstXeZ9rx3G7hb/jEXs5xZ5KIfZHwY4mbo0KqR/fSJZKaUsvk2Nc/UEOVcUx2mTNmYg==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0", - "focus-trap": "^2.3.0" + "tslib": "^1.9.3" } }, "@material/drawer": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-0.36.1.tgz", - "integrity": "sha512-Y9vCu3M4RTAGiCstksMr7PyBs0TeM8w0bfulkqJkr49V5gJOCRTyf2lzmBNq3BhsB14LZ5f7MpI242VW/04cgg==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-5.1.0.tgz", + "integrity": "sha512-Xh/kYkT8QWWXkbCI25ys6av0wrc0wXRfvnRdH34Rz4sZvWC51D6apK2bxGr+AV/uR88zwn6U8pb9cccnr+2Eqw==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/list": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/elevation": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-0.36.1.tgz", - "integrity": "sha512-kh7paJc3jc+6O6Op93j8S/eFqiA9KhSsT/gtQeVbEt2ebGweh4TTc/Smm0D/RPOzifPL1mRMAQY7SgFchlz1AQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-5.1.0.tgz", + "integrity": "sha512-NsWIT+L6x3BLouCOh3H8x885/nCrNNmzCwHEodz/0PcYQsxx9RiIVFkagmJWw/w//jej/D4NotD0xHGKOWTrFA==", "requires": { - "@material/animation": "^0.34.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0" } }, "@material/fab": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-0.37.0.tgz", - "integrity": "sha512-i/Fc6VZsxJ6jxY8JgCmfliDHF56BCsEOOVw7/rXIurP0gqyplF4LVETTerxyFGWXqx5owjbYoG8wlwaxNN/aFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-5.1.0.tgz", + "integrity": "sha512-mq9I0l4hnsMS+Ko/W7e5A8epElIp3H0UFGJzMlZX5VJBWBpfnykj7fLYnVWtyJ+zFgdLv6rpO/307Kto7gi5Pg==", "requires": { - "@material/animation": "^0.34.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, + "@material/feature-targeting": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-5.1.0.tgz", + "integrity": "sha512-z3JNWF7lP9WOzw1xBwul/HAOu4qC6EpK/8MkhjLNI9APvdYML82PWS1V0k0MiqA6Jk6uxm8DiVAk9VUqBa9/YA==" + }, "@material/floating-label": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-0.36.0.tgz", - "integrity": "sha512-hou0x0zm4FMbO0Uy9qxN/iyQznWghput+/QXSfyBE9fHE91EDFlZKirUwzmszm4B+Z3guxo04KZu4N4h6byCsg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-5.1.0.tgz", + "integrity": "sha512-5EwPiBa5A4Q678tNWdkkBGDdSCDzudhVgBtRiA/7xRo4dHXiBxX5bhE+RHrF3ZQyEf6fsShspqwAFkTA1EaplQ==", "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/form-field": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-0.37.0.tgz", - "integrity": "sha512-ZpxKoT+UCzp8/aiyTAWrHWCMiqQ8o9aHYVBC8zxy3Gt1W4e5fvxAunG7K8wzs3ADOzhpcPZCABcFrnPtuH7L1Q==", - "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" - } - }, - "@material/grid-list": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/grid-list/-/grid-list-0.36.0.tgz", - "integrity": "sha512-MnF6NY7NmFinz9+7Gh62zNK/AIrDmROPkyPoiMPBMtAdnuC5rqEDg14yIEGvBwdjrLQZ5bp8yTUR8dBsBpZTNg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-5.1.0.tgz", + "integrity": "sha512-gF2YoeCd41fIM7U1v3psEqiUdwbylbzb6BuvmcKmH0OQBP6lnRbLSbgKWldcHx2VyKTdqusu/bv6/NAe/98QiQ==", "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/icon-button": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-0.37.0.tgz", - "integrity": "sha512-zNJ6GIv/oEndC129pnnqSGEH/ctDzDQSevt2MgvSgMJiaAYli2OJNc+niEhZ2+xn1Z8dIKdHmpFkEuWd6QVRNQ==", - "requires": { - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/theme": "^0.35.0" - } - }, - "@material/icon-toggle": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/icon-toggle/-/icon-toggle-0.37.0.tgz", - "integrity": "sha512-N+Yt1QcMPomiNsUFo3teTVYnkZkl2hoSmGEUZho/vEYQHyodYhJWEv/UpVkhKN0UspSf58E3sze2QYRt+byyVg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-5.1.0.tgz", + "integrity": "sha512-HLdSkqDH1wx5YSBHz8dGEL2BKv8IDqhRul7wea9i9/3RcQz3hb5+OYpq8iiXqpxcVPVlWNud2w1oyvmEXRTdZQ==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/theme": "^0.35.0" + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/image-list": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-0.35.0.tgz", - "integrity": "sha512-n6nCl+icngiAAbOwIInNAFsJ+dgjmts+npG9tNLBvs9twBrJWavtIpkbwnQNtNlc5gBQuBRraCHIUqZ7pDY5zw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-5.1.0.tgz", + "integrity": "sha512-LFl7W8AFp2baFY38BBGVX5C6c/zZoPOsHsRMhVP8jvIH5q1BfUg6SaXkleos6Yxmy+18hdPnVuWdAQ38hhje8Q==", "requires": { - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/feature-targeting": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0" } }, "@material/layout-grid": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-0.34.0.tgz", - "integrity": "sha512-LJ3LHCumfGftl1ihO0LW9JKsnR71nnlvpzhHdUlK6o1GPul+EEUUdOFN1zxI+Ik9iS++1na/Dg8f/1sdQUxj6w==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-5.1.0.tgz", + "integrity": "sha512-6TvPVZE+UGVfmzttbRp0K6SOUvFmYI5W8p966Vztg8dYK122ondRJqMmyFf0SS0CdbrbO+bSW7/S3YkpPNrvAg==" }, "@material/line-ripple": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-0.35.0.tgz", - "integrity": "sha512-0w0kLYo2dGBiR2kgHxybifO7z4UxIYbL55EKOqkg+rG0dC+NkzFoURhjwoll6910EOlS//5UNo1N/u3to3uNjg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-5.1.0.tgz", + "integrity": "sha512-esf2/ROZl1eVpyGCWPvxMSGVkuIOG5Fm6qufOLp7XIx5IL1O0bsm+bV6cVC4JCCtmNOag4GOBgkKKbkOvp/R6g==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/linear-progress": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-0.35.0.tgz", - "integrity": "sha512-ZU4wZxcJnkiu/jwp4EiwL3A61xuh2sdwthBTuySz1JPeipHUQ3t+lPzD5RwOQQ+akNTgf7q03s94Aaxq8ZUtlA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-5.1.0.tgz", + "integrity": "sha512-wuBH2Y7psdiG5ubsKCHFWriHv4IqLeUARCmHoHyFsAdW0snwMPzSgb2mbVDiGl5gjWbSDxBsqGjKo5kOl3Vaug==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/progress-indicator": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/list": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-0.37.0.tgz", - "integrity": "sha512-ZkdwVxvMDdu9B6TLQyjxBLTpyi7yBT4JEGI52EM2VtEVXGu4Y7QEjApxZu0qh8gd43qqfeFbdLlp+yXjfU1d9g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-5.1.0.tgz", + "integrity": "sha512-fcHMJLmmtFYeMU8CO9VsXoRRm3/2jhPVMWK3lpuARZxvkNyZqjQG0mGtpWgw4oekerM/B37TGGFmN3R5DSyGcg==", "requires": { - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/menu": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-0.36.1.tgz", - "integrity": "sha512-Bc1Bga7QPaBTw1+d50hvFth6I4HirBknur1lfOm+VQnLrmmCeHRBtpjT1l2PAgiFHFWu+3SY5HanwynEdFgKYQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-5.1.0.tgz", + "integrity": "sha512-ssJNcbdyLewgL7hnj4C7JeXO3GvV4G2i1//Ych2s+au7AcJ/6/YeTTKhiCkoSpS7pb7axB3dMKwQWor2glec5Q==", + "requires": { + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/list": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/menu-surface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-5.1.0.tgz", + "integrity": "sha512-8EqkrKP92O4xaPVItz2841OfmuH3zyCclU1iC0NSBa39MwmYt7ML3IEaOXwOzKlcNGOcC7qPeqcpYlUsfMYX3g==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/notched-outline": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-0.35.0.tgz", - "integrity": "sha512-VXng7P2E0FPbhmoe0afSnKmHocrwOxVHSaEnt46lZL0nT4O19JISprgCWrFHblbhq92SrppHdS73PHzxgfI9HQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-5.1.0.tgz", + "integrity": "sha512-mQ3NjJR1jLXnJi6jhs20ftTf0yU1gWpYlyx1GizU0f7pLEqcIrFnw6G+pavcnKqP+JXNkzAQeGbmZvYBQnxokA==", + "requires": { + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/progress-indicator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-5.1.0.tgz", + "integrity": "sha512-+bsiQogKFu42Td8cXpsxX1u2BOyB4erR6NBWMrSWZJNmKM95EFQrQEnr9nxfU94bY47V3UqYtcAY9Y6GgfJyZQ==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "tslib": "^1.9.3" } }, "@material/radio": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-0.37.0.tgz", - "integrity": "sha512-hEPp3HlhRn9Yt6B1fw1guz5QyIlUYjDrpvwgwPncyZ2SYqKhp/hb02/58amV3LHbFvgRFJnsSaBY5l5Hbmf3bw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-5.1.0.tgz", + "integrity": "sha512-srAchlY1TKkmQAdMHqbP9vLkN7gmiWX6FGzArgKomd6Es8OqF2P3jvPcQizqz4OFYZIMrxARdW6r8QvhG0lZEg==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/ripple": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-0.37.0.tgz", - "integrity": "sha512-ybK8w1UlzUn6UJLoCqM3steG9q4exVkR6kZdywy2dE+ddGLe0VRQ/TcJYSfZTIQ0sMyfu8io72iscVWY9dDWdg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-5.1.0.tgz", + "integrity": "sha512-mluIf+HaaCplszp9/MAl178FpfIJWi5hSyQOpF7w8RTzRSaH8J0uwgmn8VeNnwe1TAWio0vQzHrz4iEg2r7Ngw==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/rtl": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-0.36.0.tgz", - "integrity": "sha512-uCMwWGdKG0ooYh1kVINz7vTgSY++9wnvU3kOqjRdfOY+PZHWSa/X/EqRdE9Q1pUFwYlQeU2PXE/Z2dTK/nlziw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-5.1.0.tgz", + "integrity": "sha512-Hij4KJIfjK63HArdQ3K1INMo0MbigDgL0JhjO1VDk5c+iYmYpjDI7wgPLmV5ISCBtenXRWpo1xbBO3uEmtCd4Q==" }, "@material/select": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-0.37.0.tgz", - "integrity": "sha512-9WZS3cXdb5Xy/b0TWt9jNif+S6HvRSLwj6uT8+Ij8/G0q5yjN94yAWi3wMw7bAZyfek0u7ak7WAz/8SxkiUe8g==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/floating-label": "^0.36.0", - "@material/line-ripple": "^0.35.0", - "@material/notched-outline": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-5.1.0.tgz", + "integrity": "sha512-AAXscWDMjpVfO91VYKhxdP8XTyZ6fJFNFEgL0lxccvRqU8qFt5cPQ+7W1IgMWYdrnvHhANa8DLTrpnepSq4irQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/menu": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, - "@material/selection-control": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/selection-control/-/selection-control-0.37.0.tgz", - "integrity": "sha512-HG5jzNAVVu/ZbtQaiPzZreXovZJ0WpuiQHWMsfmJybjfhC/ZBT2xjvDZJEQXZLunYXeOJPKKh3In6E+U0w5XDg==", + "@material/shape": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-5.1.0.tgz", + "integrity": "sha512-/k27T9fhQ1zj7VCsS26nv0TzsOi142ncik2mycEXq8753PDBotob7Y19pbwivwt9QxkglhMGH0EaWdZPzBoQXw==", "requires": { - "@material/ripple": "^0.37.0" + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0" } }, - "@material/shape": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-0.35.0.tgz", - "integrity": "sha512-WMmGLWrqRymMn8gaPybDWRIx7zNurUmaUa/OoxB++HSiLdLZf8hdEffiWLgqc5u97eRpb4IRaIi/jzcPbWxiUw==" - }, "@material/slider": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-0.36.0.tgz", - "integrity": "sha512-WB4j62IzrQgToWrDwe5ssSX/7wUD2cvCNlVkehz0syjUMWLCDv3ZrWTJQhd3K6XE3TjSjtTa5JjhkuezAAr41A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-5.1.0.tgz", + "integrity": "sha512-3+0kIgqowmUK0AXOC0jvR+8fqFJobdWuthfbuYBV+PFGBa9+zUow6Txf/yrhtCeQ01FHXw2iNeEFXSws+MYP9w==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/snackbar": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-0.36.0.tgz", - "integrity": "sha512-Q5YL/DLa/cBcE8PGU1HGNsb63OoKknjmL4vYvIMlgy+uNljjXoVBg80Kl5sp8RMzf5XiHByeJaSS1XB7g1ynRQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-5.1.0.tgz", + "integrity": "sha512-bn6WydEGKZxq24aZ6BfnLGPbhCww2srOe+mn2W9VJFBfZEh9qnCcya2jHs295pPbzRtDM1b2oR2LiAKBfIBt3A==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/icon-button": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, "@material/switch": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-0.36.1.tgz", - "integrity": "sha512-CmpzhrahaHxZzhmRTEEuSjsNeALmlc9x1Roy18G7DtYKfPiBX0lXU8gQNKTPYX1rCeL4O4wp/HexFuFJlCRMGA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-5.1.0.tgz", + "integrity": "sha512-cHFzquY8NINZIIaDdA+T3gwBR5V0lRORh6BNq4EBD69GiGQamoz1S8APr5ea1Sodt7Dm1yzkDRbbDO+yoNgR9g==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/tab": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-5.1.0.tgz", + "integrity": "sha512-awur1Yv2QjJ8ghNyZ/oF6MThxczGDdGqimrzcgS0wI04sg2eTiU5Ed6KV3VILVsD9fA8kKR/e5XEh0CXjqhUYQ==", "requires": { - "@material/animation": "^0.34.0", - "@material/elevation": "^0.36.1", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/tab-indicator": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" } }, - "@material/tabs": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/tabs/-/tabs-0.37.0.tgz", - "integrity": "sha512-d6Vo1C9MSuuwBoNXwssWu9G1muFlp9ogZesq9dwZLvzedfZiiA3lcK2XUVXNBibYWkQXSYSiipPYq2ebpOmxdA==", + "@material/tab-bar": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-5.1.0.tgz", + "integrity": "sha512-zK1Fe+in5cjkNIQH3Z7NiKqz0hNWehgr5e8lO0MxAFoTRodxUw5OhM9rse18c42uW+fItTJeSpLdz7RceENpyw==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/tab": "^5.1.0", + "@material/tab-scroller": "^5.1.0", + "tslib": "^1.9.3" } }, - "@material/textfield": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-0.37.0.tgz", - "integrity": "sha512-r9nCadBIWOBclhEB8j/Ei0wMFNgt0Itqb88/QlAzPl+oEe2QsNWG6D1dXSMhhYWlsRq8BVYNCFU+EomxZW/xfQ==", + "@material/tab-indicator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-5.1.0.tgz", + "integrity": "sha512-vy/oBsvRQaQ2EscsgFp9xu7tZM6UBECmNxcC1k2eQGhNjy7olkoL9bX/ymiN4xAjQYqvP6BnC3LN3IywvKMTxQ==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/floating-label": "^0.36.0", - "@material/line-ripple": "^0.35.0", - "@material/notched-outline": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" } }, - "@material/theme": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-0.35.0.tgz", - "integrity": "sha512-jTjRDPKlWVCNnSs4RRe/eq9+F5lFBzxfbuI7klgCR6jTXRMB93jKKKO7k6chgo9l0oObhLh81ao6sq/eV0WFIw==" + "@material/tab-scroller": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-5.1.0.tgz", + "integrity": "sha512-7b1Ea5tLc0A0iQEWYHXj8jfdJgYFMaaWjs9BOJyPBw7m2PyDnVwPGngPC5RqmxjDdyEeXbtDHsnMLZmjdT5g6A==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/tab": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/textfield": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-5.1.0.tgz", + "integrity": "sha512-Vipvw75AXj4G/BGXv3DyrGozbvHxGtcNGig1e5pz1ERvcmZN5epLyGStznxEIZYNf0Q+6O/NwSRxZGgrdI2w8w==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + } }, - "@material/toolbar": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/toolbar/-/toolbar-0.37.0.tgz", - "integrity": "sha512-62rH9K+npoHlrevxkh2nMIB5d+6OLAMCD7uIgJfOuSi9xxIOmSOnGimSUT4uVIVub5uA4HXLgpBC0A1b3So0eg==", + "@material/theme": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-5.1.0.tgz", + "integrity": "sha512-VoaCYAubn/oEG1/fu/yP4nxAw8sLEphFOGGBJxcPGQoLgQ9qcvibsV3G5H9S6AtmhJxgSGU0JnO9TaiuhQq5zA==", "requires": { - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/feature-targeting": "^5.1.0" } }, "@material/top-app-bar": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-0.37.0.tgz", - "integrity": "sha512-6SZGJyhdxJSs1Mb1peX2mrtK14f2jQzQLazfPc1KkjTZfSYnaRno3i3/HyZvUb5FKOXCRjlxrhejAk9f8dqItw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-5.1.0.tgz", + "integrity": "sha512-ySCUpwIFnCmY/I9/XPs0IPBCvjWzc2NQ7mquG7qQoaUVUqWTNMyL15zG6CeDf2/Nk14mlSRNM4LRPFWenCdJoQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + } + }, + "@material/touch-target": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-5.1.0.tgz", + "integrity": "sha512-lR3eoL1D0I/hyEK6I7bMFDBy/pE0yYvjYUZtL1vC7+2i54A4FgQ2hwnpQJVaZQXzrHdj6xsXmODphmUsH5gqPA==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0" } }, "@material/typography": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-0.35.0.tgz", - "integrity": "sha512-7uXybSQToQCgB19RT0Pq47NkXSSojpbccVAObw/7fmfNUTcr3elNc8iPS/f1slYDTDEdyqM7hCreLcfZQK8ATQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-5.1.0.tgz", + "integrity": "sha512-yh02koa6JLyPT5u7Zb31kyqhoZoppL0n9FmZK+eHXZcfeDF7ROL0UmtRsEjQxfnCNZRR+FIhAgrzdYxClwH05g==", + "requires": { + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0" + } }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -680,26 +1104,53 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@rollup/plugin-commonjs": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.0.0.tgz", + "integrity": "sha512-/omBIJG1nHQc+bgkYDuLpb/V08QyutP9amOrJRUSlYJZP+b/68gM//D8sxJe3Yry2QnYIr3QjR3x4AlxJEN3GA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8" + } + }, "@rollup/plugin-node-resolve": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz", - "integrity": "sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.1.0.tgz", + "integrity": "sha512-ouBBppRdWJKCllDXGzJ7ZIkYbaq+5TmyP0smt1vdJCFfoZhLi31vhpmjLhyo8lreHf4RoeSNllaWrvSqHpHRog==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.6", - "@types/resolve": "0.0.8", + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.14.2" + "resolve": "^1.19.0" } }, "@rollup/pluginutils": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.8.tgz", - "integrity": "sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { - "estree-walker": "^1.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "dependencies": { "estree-walker": { @@ -710,33 +1161,32 @@ } } }, - "@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==", - "dev": true - }, - "@types/events": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "dev": true, "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } }, "@types/jasmine": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.9.tgz", - "integrity": "sha512-KNL2Fq6GRmty2j6+ZmueT/Z/dkctLNH+5DFoGHNDtcgt7yME9NZd8x2p81Yuea1Xux/qAryDd3zVLUoKpDz1TA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", + "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/minimatch": { @@ -745,34 +1195,43 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, "@types/node": { - "version": "13.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.2.tgz", - "integrity": "sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg==", + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", + "dev": true + }, + "@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==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/rollup": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@types/rollup/-/rollup-0.54.0.tgz", - "integrity": "sha512-oeYztLHhQ98jnr+u2cs1c3tHOGtpzrm9DJlIdEjznwoXWidUbrI+X6ib7zCkPIbB7eJ7VbbKNQ5n/bPnSg6Naw==", - "dev": true, - "requires": { - "rollup": "*" - } - }, "@types/selenium-webdriver": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.9.tgz", - "integrity": "sha512-HopIwBE7GUXsscmt/J0DhnFXLSmO04AfxT6b8HAprknwka7pqEWquWDMXxCjd+NUHK9MkCe1SDKKsMiNmCItbQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.11.tgz", + "integrity": "sha512-VHv3kVxdploPZRa5Epsrgae9f8Wp0B+TVj3L93Yv0nB2RCRGRTKuhz/vRUZR4yItLqzdIxsxALe3qT3yqTAJTg==", "dev": true }, "@types/unist": { @@ -802,178 +1261,177 @@ } }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -995,10 +1453,10 @@ "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", "dev": true }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "accepts": { @@ -1012,9 +1470,9 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "after": { @@ -1024,9 +1482,9 @@ "dev": true }, "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -1057,12 +1515,11 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true }, "angular2-template-loader": { "version": "0.6.2", @@ -1094,9 +1551,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -1119,20 +1576,11 @@ } }, "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1190,12 +1638,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "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-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1236,14 +1678,23 @@ "dev": true }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "assert": { @@ -1295,7 +1746,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "dev": true, + "optional": true }, "async-limiter": { "version": "1.0.1", @@ -1309,6 +1761,49 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "axobject-query": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", @@ -1492,15 +1987,6 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backbone": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", - "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", - "dev": true, - "requires": { - "underscore": ">=1.8.3" - } - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -1575,21 +2061,21 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "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==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "better-assert": { @@ -1608,11 +2094,34 @@ "dev": true }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "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": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1626,9 +2135,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "body-parser": { @@ -1649,6 +2158,12 @@ "type-is": "~1.6.17" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1712,28 +2227,38 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "browserify-zlib": { @@ -1745,6 +2270,19 @@ "pako": "~1.0.5" } }, + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, "btoa": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", @@ -1762,28 +2300,6 @@ "isarray": "^1.0.0" } }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1797,9 +2313,9 @@ "dev": true }, "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, "builtin-status-codes": { @@ -1815,9 +2331,9 @@ "dev": true }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -1837,12 +2353,6 @@ "y18n": "^4.0.0" }, "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1853,9 +2363,9 @@ } }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -1870,6 +2380,12 @@ "glob": "^7.1.3" } }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -1895,6 +2411,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -1924,24 +2450,34 @@ "dev": true }, "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" } }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001181", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz", + "integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==", + "dev": true + }, "canonical-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", @@ -1955,20 +2491,12 @@ "dev": true, "requires": { "lodash": "^4.17.14" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } } }, "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", "dev": true }, "chalk": { @@ -1980,17 +2508,6 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "change-case": { @@ -2032,9 +2549,9 @@ "dev": true }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "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", @@ -2044,7 +2561,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.5.0" } }, "chownr": { @@ -2101,29 +2618,38 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -2135,33 +2661,69 @@ "shallow-clone": "^3.0.0" } }, + "clonedeep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clonedeep/-/clonedeep-2.0.0.tgz", + "integrity": "sha1-jOygd39He78x/oyHGq9jo5C7wnI=", + "dev": true + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": 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=", - "dev": true + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } }, "codelyzer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz", - "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", + "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", "dev": true, "requires": { - "app-root-path": "^2.2.1", + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", "aria-query": "^3.0.0", "axobject-query": "2.0.2", "css-selector-tokenizer": "^0.7.1", "cssauron": "^1.4.0", "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", "semver-dsl": "^1.0.1", "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "dependencies": { + "@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "dev": true + }, + "@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "dev": true + } } }, "collection-visit": { @@ -2174,6 +2736,16 @@ "object-visit": "^1.0.0" } }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2189,6 +2761,22 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dev": true, + "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==", + "dev": true + }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", @@ -2213,12 +2801,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2333,6 +2915,15 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, + "copy-anything": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz", + "integrity": "sha512-lA57e7viQHOdPQcrytv5jFeudZZOXuyk47lZym279FiDQ8jeZomXiGuVf6ffMKkJ+3TIai3J1J3yi6M+/4U35g==", + "dev": true, + "requires": { + "is-what": "^3.7.1" + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -2348,9 +2939,9 @@ }, "dependencies": { "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -2398,9 +2989,9 @@ } }, "cpy": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.0.tgz", - "integrity": "sha512-XwlImkjPxMr01qXqC564VD4rfcDQ2eKtYmFlCy0ixsLRJ1cwYVUBh+v47jsQTO1IrmvdjqO813VpDQ0JiTuOdA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.1.tgz", + "integrity": "sha512-vqHT+9o67sMwJ5hUd/BAOYeemkU+MuFRsK2c36Xc3eefQpAsp1kAsyDxEDcc5JS1+y9l/XHPrIsVTcyGGmkUUQ==", "dev": true, "requires": { "arrify": "^2.0.1", @@ -2415,23 +3006,31 @@ } }, "cpy-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.0.tgz", - "integrity": "sha512-LJhHvFragWvIsJH1kjhzZwGSagukewJZ5nV5yjMc5TILs+Z/CbZSvX0W9t9XC26Mw32j56UHjR3co5kAXaeTwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.1.tgz", + "integrity": "sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg==", "dev": true, "requires": { "cpy": "^8.0.0", - "meow": "^5.0.0" + "meow": "^6.1.1" } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { @@ -2461,31 +3060,16 @@ "sha.js": "^2.4.8" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -2501,24 +3085,88 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.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 + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz", + "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==", "dev": true, "requires": { - "camelcase": "^5.3.1", + "camelcase": "^6.2.0", "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.23", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" + "icss-utils": "^5.0.0", + "loader-utils": "^2.0.0", + "postcss": "^8.1.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" }, "dependencies": { "big.js": { @@ -2527,6 +3175,12 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -2534,38 +3188,97 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } } } }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "fastparse": "^1.1.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "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 + } } }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, "cssauron": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", @@ -2581,15 +3294,166 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -2615,265 +3479,100 @@ "dev": true }, "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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=", "dev": true }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "decamelize": "^1.1.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=", + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + } + } + }, + "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=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "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==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "kind-of": "^6.0.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "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==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": 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" - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "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-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" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "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=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "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=", - "dev": true - }, - "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=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2921,18 +3620,18 @@ } }, "dgeni": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.12.tgz", - "integrity": "sha512-AhlRuwduzZhHIpf8DYZ0wWHLvV+9IQ8dQRqzx3ryYEg9trU/gWc2xz3wnJrRpDnS6Hu6F73saj6m1xbckW3k9Q==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/dgeni/-/dgeni-0.4.13.tgz", + "integrity": "sha512-gryF1gNdzbQdgAeQxjaFbbKgR0qzyjq93Rc6/3CsBIN88NJ5yvsT4x26BvCKVI6jh2WatgvuGj+akmWvGndTyQ==", "dev": true, "requires": { "canonical-path": "~0.0.2", + "clonedeep": "^2.0.0", "dependency-graph": "^0.7.0", "di": "0.0.1", - "lodash": "^4.17.10", + "fast-deep-equal": "^3.1.3", "objectdiff": "^1.1.0", "optimist": "~0.6.1", - "q": "^1.5.1", "validate.js": "^0.12.0", "winston": "^2.1.1" }, @@ -2942,13 +3641,19 @@ "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", "integrity": "sha1-4x65N6jJPuKgHfGDl5RyGQKHRXQ=", "dev": 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==", + "dev": true } } }, "dgeni-packages": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.28.3.tgz", - "integrity": "sha512-WyVzY3Q4ylfnc2677le5G7a7WqkF88rBSjU9IrAofqro71yzZeWLoEdr/gJY+lJZ0PrDyuRW05pFvIbvX8N0PQ==", + "version": "0.28.4", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.28.4.tgz", + "integrity": "sha512-7AUG3pKpWtn69c3v2Mzgh+i5gd+L0AxFfYGWGzBdlJqMlQfaQPQjaS54iYCvnOlK9rXBn9j39yO6EU70gDZuFw==", "dev": true, "requires": { "canonical-path": "^1.0.0", @@ -2974,16 +3679,10 @@ "urlencode": "^1.1.0" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true } } @@ -3009,6 +3708,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "dir-glob": { @@ -3043,15 +3750,15 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", "dev": true }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true } } @@ -3096,10 +3803,19 @@ "no-case": "^2.2.0" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexify": { @@ -3147,15 +3863,24 @@ "dev": true }, "ejs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.1.tgz", - "integrity": "sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "electron-to-chromium": { + "version": "1.3.648", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.648.tgz", + "integrity": "sha512-4POzwyQ80tkDiBwkxn7IpfzioimrjRSFX1sCQ3pLZsYJ5ERYmwzdq0hZZ3nFP7Z6GtmnSn3xwWDm8FPlMeOoEQ==", "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -3165,12 +3890,20 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "emojis-list": { @@ -3195,55 +3928,55 @@ } }, "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", + "base64id": "2.0.0", "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", + "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~6.1.0", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -3252,26 +3985,47 @@ "requires": { "ms": "2.0.0" } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } } } }, "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -3345,6 +4099,45 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3357,43 +4150,6 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -3411,12 +4167,20 @@ "dev": true }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -3425,6 +4189,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -3432,15 +4202,15 @@ "dev": true }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, "evp_bytestokey": { @@ -3453,21 +4223,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3650,12 +4405,6 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -3663,19 +4412,18 @@ "dev": true }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "minimatch": "^3.0.4" } }, "fill-range": { @@ -3731,19 +4479,26 @@ } } }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { @@ -3782,39 +4537,11 @@ } } }, - "focus-trap": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.6.tgz", - "integrity": "sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg==", - "requires": { - "tabbable": "^1.0.3" - } - }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true }, "for-in": { "version": "1.0.2", @@ -3923,31 +4650,39 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-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": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "get-intrinsic": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", + "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", "dev": true, "requires": { - "pump": "^3.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, "get-value": { @@ -3971,9 +4706,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "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" @@ -4008,39 +4743,33 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.2" } }, - "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "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 - } + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -4109,6 +4838,12 @@ } } }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -4162,13 +4897,22 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "hash.js": { @@ -4195,15 +4939,15 @@ } }, "hast-util-is-element": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.4.tgz", - "integrity": "sha512-NFR6ljJRvDcyPP5SbV7MyPBgF47X3BsskLnmw1U34yL+X6YC0MoBx9EyMg8Jtx4FzGH95jw8+c1VPLHaRA0wDQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", "dev": true }, "hast-util-parse-selector": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", - "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", "dev": true }, "hast-util-to-html": { @@ -4252,10 +4996,10 @@ "upper-case": "^1.1.3" } }, - "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==", + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, "hmac-drbg": { @@ -4275,10 +5019,28 @@ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "html-void-elements": { @@ -4329,9 +5091,9 @@ } }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -4355,18 +5117,15 @@ } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "iferr": { @@ -4381,6 +5140,13 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4427,10 +5193,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "injection-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -4442,10 +5225,10 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true }, "is-accessor-descriptor": { @@ -4505,6 +5288,35 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4525,6 +5337,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", @@ -4551,9 +5369,9 @@ } }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true }, "is-extendable": { @@ -4578,9 +5396,9 @@ } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { @@ -4598,6 +5416,12 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, + "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==", + "dev": true + }, "is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", @@ -4613,12 +5437,24 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4634,11 +5470,41 @@ "isobject": "^3.0.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, "is-upper-case": { "version": "1.1.2", @@ -4649,10 +5515,10 @@ "upper-case": "^1.1.0" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "is-what": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", + "integrity": "sha512-2ilQz5/f/o9V7WRWJQmpFYNmQFZ9iM+OXRonZKcYgTkCzjb949Vi4h282PD1UfmgHk666rcWonbRJ++KI41VGw==", "dev": true }, "is-windows": { @@ -4662,10 +5528,13 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -4674,13 +5543,10 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -4700,315 +5566,116 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", "dev": true, "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" }, "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ajv": "^5.0.0" } - }, + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "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==", "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^4.0.0" } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true } } }, - "istanbul-api": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", - "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "compare-versions": "^3.4.0", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "requires": { - "convert-source-map": "^1.5.0", - "istanbul-lib-instrument": "^1.7.3", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "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==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "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==", "dev": true }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5018,35 +5685,58 @@ } }, "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } } }, "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", "dev": true }, "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-6.0.0.tgz", + "integrity": "sha512-MvTOVoMxDZAftQYBApIlSfKnGMzi9cj351nXeqtnZTuXffPlbONN31+Es7F+Ke4okUeQ2xISukt4U1npfzLVrQ==", "dev": true, "requires": { - "colors": "1.1.2" + "colors": "1.4.0" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + } } }, - "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5054,9 +5744,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5072,9 +5762,9 @@ } }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-better-errors": { @@ -5083,6 +5773,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -5111,108 +5807,182 @@ "dev": true }, "karma": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", - "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", + "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz", - "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==", + }, + "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" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "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==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "lodash": "^4.17.11", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "minimatch": "^3.0.4" }, "dependencies": { "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "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==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, "semver": { @@ -5224,22 +5994,100 @@ } }, "karma-coverage-istanbul-reporter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", - "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, "requires": { - "istanbul-api": "^2.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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==", + "dev": true + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "karma-jasmine": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.1.1.tgz", - "integrity": "sha512-pxBmv5K7IkBRLsFSTOpgiK/HzicQT3mfFF+oHAC7nxMfYKhaYFgxOa5qjnHW4sL5rUnmdkSajoudOnnOdPyW4Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", "dev": true, "requires": { - "jasmine-core": "^3.5.0" + "jasmine-core": "^3.6.0" } }, "karma-junit-reporter": { @@ -5253,9 +6101,9 @@ } }, "karma-sourcemap-loader": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", - "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz", + "integrity": "sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g==", "dev": true, "requires": { "graceful-fs": "^4.1.2" @@ -5333,45 +6181,64 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "less": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.0.tgz", + "integrity": "sha512-w1Ag/f34g7LwtQ/sMVSGWIyZx+gG9ZOAEtyxeX1fG75is6BMyC2lD5kG+1RueX7PkAvlQBm2Lf2aN2j0JbVr2A==", "dev": true, "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true } } }, + "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=", + "dev": true + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -5390,13 +6257,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -5405,26 +6271,98 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { - "date-format": "^2.0.0", + "date-format": "^3.0.0", "debug": "^4.1.1", - "flatted": "^2.0.0", + "flatted": "^2.0.1", "rfdc": "^1.1.4", - "streamroller": "^1.0.6" + "streamroller": "^2.2.4" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -5444,16 +6382,6 @@ "js-tokens": "^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" - } - }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -5470,21 +6398,14 @@ } }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^4.0.0" } }, - "lunr": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", - "integrity": "sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==", - "dev": true - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -5495,9 +6416,9 @@ } }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -5517,21 +6438,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5539,9 +6445,9 @@ "dev": true }, "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", "dev": true }, "map-visit": { @@ -5560,48 +6466,53 @@ "dev": true }, "material-components-web": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-0.37.0.tgz", - "integrity": "sha512-MgvcrriOtjPPJgnr4PAbVEeFabmUuv4U+cSEFbvwY5Au+Krp7B1LW/Z7/+wW9PmfXQJBPICy5Iql6vgB6mPNXw==", - "requires": { - "@material/animation": "^0.34.0", - "@material/auto-init": "^0.35.0", - "@material/base": "^0.35.0", - "@material/button": "^0.37.0", - "@material/card": "^0.37.0", - "@material/checkbox": "^0.37.0", - "@material/chips": "^0.37.0", - "@material/dialog": "^0.37.0", - "@material/drawer": "^0.36.1", - "@material/elevation": "^0.36.1", - "@material/fab": "^0.37.0", - "@material/floating-label": "^0.36.0", - "@material/form-field": "^0.37.0", - "@material/grid-list": "^0.36.0", - "@material/icon-button": "^0.37.0", - "@material/icon-toggle": "^0.37.0", - "@material/image-list": "^0.35.0", - "@material/layout-grid": "^0.34.0", - "@material/line-ripple": "^0.35.0", - "@material/linear-progress": "^0.35.0", - "@material/list": "^0.37.0", - "@material/menu": "^0.36.1", - "@material/notched-outline": "^0.35.0", - "@material/radio": "^0.37.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/select": "^0.37.0", - "@material/selection-control": "^0.37.0", - "@material/shape": "^0.35.0", - "@material/slider": "^0.36.0", - "@material/snackbar": "^0.36.0", - "@material/switch": "^0.36.1", - "@material/tabs": "^0.37.0", - "@material/textfield": "^0.37.0", - "@material/theme": "^0.35.0", - "@material/toolbar": "^0.37.0", - "@material/top-app-bar": "^0.37.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-5.1.0.tgz", + "integrity": "sha512-02P8D749kXZBjnTb16ISwucD2TLiw3j7mbjVnAF4+jNlEuNv1cB1qtXSzsavGpATzgoDU0xvzufrfBUqHIaAVA==", + "requires": { + "@material/animation": "^5.1.0", + "@material/auto-init": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/card": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/chips": "^5.1.0", + "@material/data-table": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dialog": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/drawer": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/fab": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/form-field": "^5.1.0", + "@material/icon-button": "^5.1.0", + "@material/image-list": "^5.1.0", + "@material/layout-grid": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/linear-progress": "^5.1.0", + "@material/list": "^5.1.0", + "@material/menu": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/radio": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/select": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/slider": "^5.1.0", + "@material/snackbar": "^5.1.0", + "@material/switch": "^5.1.0", + "@material/tab": "^5.1.0", + "@material/tab-bar": "^5.1.0", + "@material/tab-indicator": "^5.1.0", + "@material/tab-scroller": "^5.1.0", + "@material/textfield": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/top-app-bar": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, "md5.js": { @@ -5615,23 +6526,18 @@ "safe-buffer": "^5.1.2" } }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -5669,43 +6575,40 @@ } }, "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "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": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "micromatch": { @@ -5821,6 +6724,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "mime": { @@ -5830,18 +6741,18 @@ "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -5850,6 +6761,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -5878,13 +6795,14 @@ "dev": true }, "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "dependencies": { "arrify": { @@ -5935,9 +6853,9 @@ } }, "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "move-concurrently": { @@ -5955,9 +6873,9 @@ }, "dependencies": { "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5980,6 +6898,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5999,6 +6923,37 @@ "to-regex": "^3.0.1" } }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -6017,11 +6972,204 @@ "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "ng-packagr": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-11.1.2.tgz", + "integrity": "sha512-Ud6DJC4eiiQHDUi3BegW50gJfvUfbXTu9fqR/Hhj0s42PLDOfGzbIAFhz8AhiDNdzptZTsinITvESuKj12CIAA==", + "dev": true, + "requires": { + "@rollup/plugin-commonjs": "^17.0.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^11.1.0", + "ajv": "^7.0.3", + "ansi-colors": "^4.1.1", + "autoprefixer": "^9.6.5", + "browserslist": "^4.16.1", + "chokidar": "^3.5.1", + "commander": "^7.0.0", + "cssnano-preset-default": "^4.0.7", + "glob": "^7.1.6", + "injection-js": "^2.4.0", + "less": "^4.1.0", + "node-sass-tilde-importer": "^1.0.2", + "ora": "^5.1.0", + "postcss": "^7.0.29", + "postcss-url": "^8.0.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^3.0.0", + "rollup": "^2.37.0", + "rollup-plugin-sourcemaps": "^0.6.3", + "rxjs": "^6.5.0", + "sass": "^1.32.5", + "stylus": "^0.54.8", + "terser": "^5.5.1" + }, + "dependencies": { + "ajv": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "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" + } + }, + "commander": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", + "dev": 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==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.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" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + } + } }, "no-case": { "version": "2.3.2", @@ -6097,13 +7245,19 @@ } } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { - "abbrev": "1" + "find-parent-dir": "^0.3.0" } }, "normalize-package-data": { @@ -6124,15 +7278,33 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "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=", + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "path-key": "^2.0.0" + "boolbase": "~1.0.0" } }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6140,21 +7312,21 @@ "dev": true }, "nunjucks": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.1.tgz", - "integrity": "sha512-LYlVuC1ZNSalQQkLNNPvcgPt2M9FTY9bs39mTCuFXtqh7jWbYzhDlmz2M6onPiXEhdZo+b9anRhc+uBGuJZ2bQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz", + "integrity": "sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA==", "dev": true, "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", "chokidar": "^3.3.0", - "commander": "^3.0.2" + "commander": "^5.1.0" }, "dependencies": { "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true } } @@ -6202,6 +7374,18 @@ } } }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6211,6 +7395,29 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -6220,6 +7427,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, "objectdiff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/objectdiff/-/objectdiff-1.1.0.tgz", @@ -6244,10 +7463,19 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", + "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -6272,18 +7500,71 @@ } } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "os-browserify": { @@ -6292,23 +7573,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-all": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", @@ -6326,19 +7590,13 @@ } } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-event": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", - "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, "requires": { - "p-timeout": "^2.0.1" + "p-timeout": "^3.1.0" } }, "p-filter": { @@ -6364,28 +7622,22 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -6398,9 +7650,9 @@ } }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, "requires": { "p-finally": "^1.0.0" @@ -6465,29 +7717,36 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -6556,9 +7815,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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": { @@ -6567,12 +7826,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -6597,9 +7850,9 @@ } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -6621,21 +7874,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "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" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -6643,6 +7881,42 @@ "dev": true, "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, "posix-character-classes": { @@ -6652,14 +7926,14 @@ "dev": true }, "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz", + "integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -6670,1898 +7944,2125 @@ } } }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", + "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "property-information": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz", - "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "xtend": "^4.0.0" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "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==", - "dev": true - }, - "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==", + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "raw-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", - "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "minimist": "^1.2.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "has-flag": "^3.0.0" } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "p-try": "^1.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.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==", + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "picomatch": "^2.0.7" + "postcss-selector-parser": "^6.0.4" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "resolve": "^1.1.6" + "icss-utils": "^5.0.0" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "postcss": "^7.0.0" }, "dependencies": { - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "jsesc": "~0.5.0" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "rehype": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-8.0.0.tgz", - "integrity": "sha512-fqcYo/q4Xka0ZvS6abiHtZsN7/TauTzTZQfXqtWACo9Qz76Vv/8uzhOizAfDBjVPhbnDl3xPIMRArUdcV/xFaA==", + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "rehype-parse": "^6.0.0", - "rehype-stringify": "^6.0.0", - "unified": "^7.0.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "rehype-stringify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-6.0.1.tgz", - "integrity": "sha512-JfEPRDD4DiG7jet4md7sY07v6ACeb2x+9HWQtRPm2iA6/ic31hCv1SNBUtpolJASxQ/D8gicXiviW4TJKEMPKQ==", + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "hast-util-to-html": "^6.0.0", - "xtend": "^4.0.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.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=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "is-finite": "^1.0.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "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 - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", - "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "rollup-plugin-sourcemaps": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.5.0.tgz", - "integrity": "sha512-xp2vvRvgnYiXydgf/JFFFgYxrqMaQaOrK/g6yZvgwT9R1TSYjD3HKku1pD7iQNjQHkl5yGpokvJLp7cP/lR+aQ==", + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.1", - "source-map-resolve": "^0.5.3" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { - "aproba": "^1.1.1" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "tslib": "^1.9.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "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 - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "ret": "~0.1.10" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", "dev": true, "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" }, "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "minimist": "^1.2.5" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } }, - "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==", + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "semver-dsl": { + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" + "xtend": "^4.0.0" } }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "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==", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" }, "dependencies": { - "extend-shallow": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "safe-buffer": "^5.1.0" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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==", "dev": true }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "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==", "dev": true, "requires": { - "no-case": "^2.2.0" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, "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" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.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=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "minimist": "^1.2.5" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } } } }, - "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==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true } } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "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=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "rehype": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-8.0.0.tgz", + "integrity": "sha512-fqcYo/q4Xka0ZvS6abiHtZsN7/TauTzTZQfXqtWACo9Qz76Vv/8uzhOizAfDBjVPhbnDl3xPIMRArUdcV/xFaA==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } + "rehype-parse": "^6.0.0", + "rehype-stringify": "^6.0.0", + "unified": "^7.0.0" } }, - "source-list-map": { + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dev": true, + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "rehype-stringify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-6.0.1.tgz", + "integrity": "sha512-JfEPRDD4DiG7jet4md7sY07v6ACeb2x+9HWQtRPm2iA6/ic31hCv1SNBUtpolJASxQ/D8gicXiviW4TJKEMPKQ==", + "dev": true, + "requires": { + "hast-util-to-html": "^6.0.0", + "xtend": "^4.0.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=", + "dev": true, + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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 }, - "source-map-explorer": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.4.0.tgz", - "integrity": "sha512-gXTmqqMlX1yF9uVZB2p9AvIhgArWvy7V+3NQ2lVgQvyux1eMAgnm3mC+k5mqV+2q7B/uWaFY+RG+fm+1opVkjA==", + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "btoa": "^1.2.1", - "chalk": "^3.0.0", - "convert-source-map": "^1.7.0", - "ejs": "^3.0.1", - "escape-html": "^1.0.3", - "glob": "^7.1.6", - "gzip-size": "^5.1.1", - "lodash": "^4.17.15", - "open": "^7.0.3", - "source-map": "^0.7.3", - "temp": "^0.9.1", - "yargs": "^15.3.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 - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "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" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "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 - }, - "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.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "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" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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" - } - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "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.1" - } - }, - "yargs-parser": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", - "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - } + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" } }, - "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==", - "dev": true, - "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" - } + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, - "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=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", "dev": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "glob": "^7.1.3" } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "spdx-license-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-2.1.0.tgz", - "integrity": "sha1-N4j/tcgLJK++goOTTp5mhOpqIY0=", - "dev": true - }, - "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==", + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "rollup": { + "version": "2.38.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.1.tgz", + "integrity": "sha512-q07T6vU/V1kqM8rGRRyCgEvIQcIAXoKIE5CpkYAlHhfiWM1Iuh4dIPWpIbqFngCK6lwAB2aYHiUVhIbSWHQWhw==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "fsevents": "~2.1.2" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "rollup-plugin-sourcemaps": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", + "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "@rollup/pluginutils": "^3.0.9", + "source-map-resolve": "^0.6.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=", + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } } } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "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" - } - }, - "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" - } - } + "aproba": "^1.1.1" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "tslib": "^1.9.0" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.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==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "ret": "~0.1.10" } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "sass": { + "version": "1.32.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.5.tgz", + "integrity": "sha512-kU1yJ5zUAmPxr7f3q0YXTAd1oZjSR1g3tYyv+xu0HZSl5JiNOaE987eiz7wCUvbm4I9fGWGU2TgApTtcP4GMNQ==", "dev": true, "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "ms": "^2.1.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } }, - "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==", + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "semver": "^5.3.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==", + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", "dev": true, "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" } }, - "stringify-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", - "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" + "randombytes": "^2.1.0" } }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "kind-of": "^6.0.2" } }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, - "tabbable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.3.tgz", - "integrity": "sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg==" - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "rimraf": "~2.6.2" + "is-arrayish": "^0.3.1" }, "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "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==", + "dev": true } } }, - "terser": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", - "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", "dev": true, "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "no-case": "^2.2.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "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": { - "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 + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "is-extendable": "^0.1.0" } } } }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "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==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "is-descriptor": "^1.0.0" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { + "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "kind-of": "^6.0.0" } }, - "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 - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "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==", + "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==", "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" + "kind-of": "^6.0.0" } }, - "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==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "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=", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -8575,1295 +10076,1869 @@ } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "to-string-loader": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz", - "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==", - "dev": true, - "requires": { - "loader-utils": "^1.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "dev": true - }, - "ts-helpers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ts-helpers/-/ts-helpers-1.1.2.tgz", - "integrity": "sha1-/Gm+nx87rtAfsaDvjUz+dIgU2DU=", - "dev": true - }, - "ts-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", - "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^4.0.0", - "semver": "^6.0.0" + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "ms": "^2.1.1" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } }, - "ts-node": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.7.0.tgz", - "integrity": "sha512-s659CsHrsxaRVDEleuOkGvbsA0rWHtszUNEt1r0CgAFN5ZZTQtDzpsluS7W5pOGJIa1xZE8R/zK4dEs+ldFezg==", + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "dev": true }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", + "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "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==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } } } }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tslint": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", - "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.10.0", - "tsutils": "^2.29.0" + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" }, "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "ms": "^2.1.1" } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "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=", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "typedoc": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.1.tgz", - "integrity": "sha512-1AckBdQNvBm0jgR7eko9t3FMPfjoxiKEpQx8ePCsyfTQDPwLVpFIFzn5pXA+smDGTWf2BT7FQrKU6BDzSdgMng==", + "source-map-explorer": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz", + "integrity": "sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg==", "dev": true, "requires": { - "fs-extra": "^8.1.0", - "handlebars": "^4.7.3", - "highlight.js": "^9.18.1", - "lodash": "^4.17.15", - "marked": "^0.8.0", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.3", - "typedoc-default-themes": "^0.8.0" + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.3", + "temp": "^0.9.4", + "yargs": "^16.2.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "color-convert": "^2.0.1" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } }, - "marked": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.1.tgz", - "integrity": "sha512-tZfJS8uE0zpo7xpTffwFwYRfW9AzNcdo04Qcjs+C9+oCy8MSRD2reD5iDVtYx8mtLaqsGughw/YLlcwNxAHA1g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "typedoc-default-themes": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.8.0.tgz", - "integrity": "sha512-0bzAjVEX6ClhE3jLRdU7vR8Fsfbt4ZcPa+gkqyAVgTlQ1fLo/7AkCbTP+hC5XAiByDfRfsAGqj9y6FNjJh0p4A==", - "dev": true, - "requires": { - "backbone": "^1.4.0", - "jquery": "^3.4.1", - "lunr": "^2.3.8", - "underscore": "^1.9.2" - } - }, - "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", - "dev": true - }, - "uglify-js": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", - "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "source-map-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", "dev": true, - "optional": true, "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, "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, - "optional": true + "dev": true } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "underscore": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", - "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true + "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==", + "dev": true, + "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" + } }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "source-map": "^0.5.6" } }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "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=", "dev": true }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": 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==", + "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": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "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 }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "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": { - "unique-slug": "^2.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "spdx-license-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-2.1.0.tgz", + "integrity": "sha1-N4j/tcgLJK++goOTTp5mhOpqIY0=", + "dev": true + }, + "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==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "extend-shallow": "^3.0.0" } }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "@types/unist": "^2.0.2" + "figgy-pudding": "^3.5.1" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.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=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "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=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } + "is-descriptor": "^0.1.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=", - "dev": true } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "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" + } + }, + "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" + } + } + } }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "upper-case": "^1.1.1" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "punycode": "^2.1.0" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.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==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, - "urlencode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", - "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", + "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": { - "iconv-lite": "~0.4.11" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "inherits": "2.0.3" + "safe-buffer": "~5.2.0" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "stringify-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz", + "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" + } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "stringmap": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "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": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "ansi-regex": "^5.0.0" } }, - "validate.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.12.0.tgz", - "integrity": "sha512-/x2RJSvbqEyxKj0RPN4xaRquK+EggjeVXiDDEyrJzsJogjtiZ9ov7lj/svVb4DM5Q5braQF4cooAryQbUwOxlA==", - "dev": true + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", - "dev": true + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "unist-util-stringify-position": "^1.1.1" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } - } - } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "vfile-message": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz", - "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==", + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "dev": true, "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, - "vm-browserify": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "swap-case": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" }, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "minimist": "^1.2.5" } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "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" + "glob": "^7.1.3" } + } + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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 }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "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": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "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 + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "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, - "optional": true, "requires": { - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "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.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "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", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "to-string-loader": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz", + "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true + }, + "ts-helpers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ts-helpers/-/ts-helpers-1.1.2.tgz", + "integrity": "sha1-/Gm+nx87rtAfsaDvjUz+dIgU2DU=", + "dev": true + }, + "ts-loader": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.14.tgz", + "integrity": "sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "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-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" + } + } + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "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=", + "dev": true + }, + "typescript": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "dev": true + }, + "unified": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", + "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "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=", + "dev": true, + "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=", "dev": true, - "optional": true, "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" + "isarray": "1.0.0" } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "^1.1.1" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "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=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "urlencode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", + "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.11" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.12.0.tgz", + "integrity": "sha512-/x2RJSvbqEyxKj0RPN4xaRquK+EggjeVXiDDEyrJzsJogjtiZ9ov7lj/svVb4DM5Q5braQF4cooAryQbUwOxlA==", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + } + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "remove-trailing-separator": "^1.0.1" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true } } }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "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" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, + "optional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -9874,6 +11949,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, + "optional": true, "requires": { "is-extglob": "^2.1.0" } @@ -9885,6 +11961,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, + "optional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -9894,6 +11971,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -9903,6 +11981,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -9912,6 +11991,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9927,6 +12007,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -9938,6 +12019,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -9947,6 +12029,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -9954,6 +12037,15 @@ } } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "web-namespaces": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", @@ -9961,40 +12053,40 @@ "dev": true }, "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^4.3.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "dependencies": { "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -10016,9 +12108,9 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "json-schema-traverse": { @@ -10048,9 +12140,9 @@ } }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -10121,6 +12213,12 @@ } } }, + "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==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -10137,9 +12235,9 @@ "dev": true }, "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", + "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", "dev": true, "requires": { "async": "~1.0.0", @@ -10158,12 +12256,6 @@ } } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -10180,49 +12272,39 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "color-convert": "^2.0.1" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "color-name": "~1.1.4" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -10233,15 +12315,10 @@ "dev": true }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "dev": true }, "x-is-string": { "version": "0.1.0", @@ -10267,46 +12344,47 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, "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==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.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==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yeast": { "version": "0.1.2", @@ -10321,10 +12399,21 @@ "dev": true }, "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.3.tgz", + "integrity": "sha512-Y4hTHoh4VcxU5BDGAqEoOnOiyT254w6CiHtpQxAJUSMZPyVgdbKf+5R7Mwz6xsPhMIeBXk5rTopRZDpjssTCUg==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } } } } diff --git a/bundle/package.json b/bundle/package.json index 99d7eef..8e7a422 100644 --- a/bundle/package.json +++ b/bundle/package.json @@ -1,16 +1,14 @@ { + "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@blox/material", - "version": "0.18.1", + "version": "1.0.0", "license": "Apache-2.0", "description": "Material Components for Angular", "author": "The Source Zone", "bugs": "https://github.com/src-zone/material/issues", "repository": "github:src-zone/material", - "homepage": "https://blox.src.zone/material", + "homepage": "https://material.src.zone/", "sideEffects": false, - "main": "dist/material.umd.js", - "module": "dist/material.es5.js", - "types": "dist/material.d.ts", "keywords": [ "angular", "material", @@ -18,79 +16,119 @@ ], "scripts": { "clean": "rimraf build dist apidocs coverage", - "ngc": "ngc -p tsconfig-lib.json", - "bundle": "ts-node --project tools/ngbundler/tsconfig.json tools/ngbundler/index.ts", - "copy-types": "cpy \"**/*.d.ts\" ../dist --cwd=build --parents", - "copy-metadata": "cpy build/material.metadata.json dist/", "apidocs": "ts-node --project tools/dgeni/tsconfig.json tools/dgeni/index.ts", - "build-noclean": "npm run ngc && npm run bundle && npm run copy-types && npm run copy-metadata && npm run apidocs", - "build": "npm run clean && npm run build-noclean", + "package": "ng-packagr -p package.json -c tsconfig-lib.json", + "build-noclean": "npm run package && npm run apidocs", + "build": "ngcc && npm run clean && npm run build-noclean", "test": "karma start", + "test:ci": "karma start", "test:watch": "karma start karma.conf.ts --single-run false" }, "dependencies": { - "material-components-web": "^0.37.0" + "material-components-web": "^5.1.0" }, "peerDependencies": { - "@angular/animations": ">=6.0.0", - "@angular/common": ">=6.0.0", - "@angular/core": ">=6.0.0", - "@angular/forms": ">=6.0.0", - "@angular/router": ">=6.0.0", - "rxjs": ">=6.0.0", - "zone.js": ">=0.8.0" + "@angular/animations": ">=10.0.0", + "@angular/common": ">=10.0.0", + "@angular/core": ">=10.0.0", + "@angular/forms": ">=10.0.0", + "@angular/router": ">=10.0.0", + "rxjs": ">=6.5.0", + "zone.js": ">=0.11.0" }, "devDependencies": { - "@angular/animations": "^9.0.7", - "@angular/common": "^9.0.7", - "@angular/compiler": "^9.0.7", - "@angular/compiler-cli": "^9.0.7", - "@angular/core": "^9.0.7", - "@angular/forms": "^9.0.7", - "@angular/platform-browser": "^9.0.7", - "@angular/platform-browser-dynamic": "^9.0.7", - "@angular/router": "^9.0.7", - "@rollup/plugin-node-resolve": "^7.1.1", - "@types/glob": "^7.1.1", - "@types/jasmine": "^3.5.9", - "@types/node": "^13.9.2", - "@types/rollup": "^0.54.0", - "@types/selenium-webdriver": "^4.0.9", + "@angular/animations": "^11.0.4", + "@angular/common": "^11.0.4", + "@angular/compiler": "^11.0.4", + "@angular/compiler-cli": "^11.0.4", + "@angular/core": "^11.0.4", + "@angular/forms": "^11.0.4", + "@angular/platform-browser": "^11.0.4", + "@angular/platform-browser-dynamic": "^11.0.4", + "@angular/router": "^11.0.4", + "@types/glob": "^7.1.3", + "@types/jasmine": "^3.6.3", + "@types/node": "^14.14.22", + "@types/selenium-webdriver": "^4.0.11", "angular2-template-loader": "^0.6.2", - "codelyzer": "^5.2.1", - "cpy-cli": "^3.1.0", - "css-loader": "^3.4.2", - "dgeni": "^0.4.12", - "dgeni-packages": "^0.28.3", + "codelyzer": "^6.0.1", + "cpy-cli": "^3.1.1", + "css-loader": "^5.0.1", + "dgeni": "^0.4.13", + "dgeni-packages": "^0.28.4", "glob": "^7.1.6", "istanbul-instrumenter-loader": "^3.0.1", - "jasmine-core": "^3.5.0", - "jasmine-spec-reporter": "^4.2.1", - "karma": "^4.4.1", + "jasmine-core": "^3.6.0", + "jasmine-spec-reporter": "^6.0.0", + "karma": "^5.2.3", "karma-chrome-launcher": "^3.1.0", - "karma-coverage": "^2.0.1", - "karma-coverage-istanbul-reporter": "^2.1.1", - "karma-jasmine": "^3.1.1", + "karma-coverage": "^2.0.3", + "karma-coverage-istanbul-reporter": "^3.0.3", + "karma-jasmine": "^4.0.1", "karma-junit-reporter": "^2.0.1", - "karma-sourcemap-loader": "^0.3.7", + "karma-sourcemap-loader": "^0.3.8", "karma-spec-reporter": "0.0.32", "karma-webpack": "^4.0.2", - "raw-loader": "^4.0.0", + "ng-packagr": "^11.1.2", + "raw-loader": "^4.0.2", "rimraf": "^3.0.2", - "rollup": "^2.1.0", - "rollup-plugin-sourcemaps": "^0.5.0", - "rxjs": "^6.5.4", - "shelljs": "^0.8.3", - "source-map-explorer": "^2.4.0", - "source-map-loader": "^0.2.4", + "rxjs": "^6.6.3", + "shelljs": "^0.8.4", + "source-map-explorer": "^2.5.2", + "source-map-loader": "^1.1.3", "to-string-loader": "^1.1.6", "ts-helpers": "^1.1.2", - "ts-loader": "^6.2.1", - "ts-node": "^8.7.0", - "tslint": "^6.1.0", - "typedoc": "^0.17.1", - "typescript": "^3.7.5", - "webpack": "^4.42.0", - "zone.js": "^0.10.3" + "ts-loader": "^8.0.14", + "ts-node": "^9.1.1", + "tslint": "^6.1.3", + "typescript": "^4.0.5", + "webpack": "^4.44.1", + "zone.js": "^0.11.3" + }, + "ngPackage": { + "assets": [ + "../README.md", + "LICENSE.txt", + "NOTICE.txt" + ], + "lib": { + "entryFile": "src/material.module.ts", + "umdId": "blox.material", + "umdModuleIds": { + "@material/animation": "mdc.animation", + "@material/checkbox": "mdc.checkbox", + "@material/chips": "mdc.chips", + "@material/dialog": "mdc.dialog", + "@material/dom": "mdc.dom", + "@material/drawer": "mdc.drawer", + "@material/floating-label": "mdc.floatingLabel", + "@material/form-field": "mdc.formField", + "@material/icon-button": "mdc.iconButton", + "@material/icon-toggle": "mdc.iconToggle", + "@material/linear-progress": "mdc.linearProgress", + "@material/line-ripple": "mdc.lineRipple", + "@material/list": "mdc.list", + "@material/menu": "mdc.menu", + "@material/menu/util": "mdc.menu", + "@material/menu-surface": "mdc.menuSurface", + "@material/notched-outline": "mdc.notchedOutline", + "@material/radio": "mdc.radio", + "@material/ripple": "mdc.ripple", + "@material/select": "mdc.select", + "@material/slider": "mdc.slider", + "@material/switch": "mdc.switch", + "@material/snackbar": "mdc.snackbar", + "@material/textfield": "mdc.textfield", + "@material/toolbar": "mdc.toolbar", + "@material/top-app-bar": "mdc.topAppBar", + "@material/tab": "mdc.tab", + "@material/tab-bar": "mdc.tabBar", + "@material/tab-indicator": "mdc.tabIndicator", + "@material/tab-scroller": "mdc.tabScroller" + } + }, + "whitelistedNonPeerDependencies": [ + "material-components-web" + ] } } diff --git a/bundle/src/components/abstract/abstract.mdc.drawer.element.ts b/bundle/src/components/abstract/abstract.mdc.drawer.element.ts deleted file mode 100644 index d8b06d8..0000000 --- a/bundle/src/components/abstract/abstract.mdc.drawer.element.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @docs-private - * Represents the different types of drawers that are supported: permanent, persistent, and temporary. - */ -export type MdcDrawerType = 'permanent' | 'persistent' | 'temporary'; - -/** - * @docs-private - * Base class for child elements of any type of drawer. The drawer will pass information to child - * directives that provide themselve as AbstractDrawerElement. -*/ -export abstract class AbstractDrawerElement { - _drawerType: MdcDrawerType = 'permanent'; -} diff --git a/bundle/src/components/abstract/abstract.mdc.input.ts b/bundle/src/components/abstract/abstract.mdc.input.ts index 2aa5517..58732e6 100644 --- a/bundle/src/components/abstract/abstract.mdc.input.ts +++ b/bundle/src/components/abstract/abstract.mdc.input.ts @@ -2,6 +2,8 @@ import { ElementRef } from '@angular/core'; /** @docs-private */ export abstract class AbstractMdcInput { - abstract id: string; + /** @internal */ + abstract id: string | null; + /** @internal */ abstract _elm: ElementRef; } diff --git a/bundle/src/components/abstract/abstract.mdc.label.ts b/bundle/src/components/abstract/abstract.mdc.label.ts index 0699e74..7be292a 100644 --- a/bundle/src/components/abstract/abstract.mdc.label.ts +++ b/bundle/src/components/abstract/abstract.mdc.label.ts @@ -2,6 +2,8 @@ import { ElementRef } from '@angular/core'; /** @docs-private */ export abstract class AbstractMdcLabel { - abstract for: string; + /** @internal */ + abstract for: string | null; + /** @internal */ abstract _elm: ElementRef; } diff --git a/bundle/src/components/abstract/mixin.mdc.hasid.ts b/bundle/src/components/abstract/mixin.mdc.hasid.ts new file mode 100644 index 0000000..5f342e4 --- /dev/null +++ b/bundle/src/components/abstract/mixin.mdc.hasid.ts @@ -0,0 +1,50 @@ +import { Directive, HostBinding, Input } from '@angular/core'; +import { Subject, Observable } from 'rxjs'; + +let nextId = 1; + +/** @docs-private */ +@Directive() +export class HasId { + private _id: string | null = null; + private cachedId: string | null = null; + private _idChange: Subject = new Subject(); + // TODO: member assignments above are never executed... + + /** @internal */ + initId() { + // Force setter to be called in case id was not specified. + this.id = this.id; + this._idChange = new Subject(); + } + + /** + * Mirrors the id attribute. If no id is assigned, this directive will + * assign a unique id by itself. + */ + @HostBinding() + @Input() get id() { + return this._id; + } + + set id(value: string | null) { + this._id = value || this._newId(); + if (this._idChange) + this._idChange.next(); + } + + /** @internal */ + _newId(): string { + this.cachedId = this.cachedId || `mdc-u-id-${nextId++}`; + return this.cachedId; + } + + /** + * @internal + * + * Subscribe to this observable to be informed of id changes. + */ + idChange(): Observable { + return this._idChange.asObservable(); + } +} diff --git a/bundle/src/components/button/mdc.button.directive.spec.ts b/bundle/src/components/button/mdc.button.directive.spec.ts index 7e84b0b..a23ef6d 100644 --- a/bundle/src/components/button/mdc.button.directive.spec.ts +++ b/bundle/src/components/button/mdc.button.directive.spec.ts @@ -1,64 +1,65 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; +import { TestBed, fakeAsync } from '@angular/core/testing'; import { Component } from '@angular/core'; -import { MdcButtonDirective } from './mdc.button.directive'; -import { booleanAttributeStyleTest, hasRipple } from '../../testutils/page.test'; +import { MdcButtonDirective, MdcButtonIconDirective, MdcButtonLabelDirective } from './mdc.button.directive'; +import { testStyle, hasRipple } from '../../testutils/page.test'; describe('MdcButtonDirective', () => { - @Component({ - template: ` - - ` - }) - class TestComponent { - raised: any = null; - outlined: any = null; - dense: any = null; - } - - function setup() { - const fixture = TestBed.configureTestingModule({ - declarations: [MdcButtonDirective, TestComponent] - }).createComponent(TestComponent); - fixture.detectChanges(); - return { fixture }; - } - - it('should render the buttons', (() => { + it('should render the button with ripple and label', fakeAsync(() => { const { fixture } = setup(); const buttons = fixture.nativeElement.querySelectorAll('button'); expect(buttons.length).toBe(1); + const button: HTMLButtonElement = buttons[0]; + expect(button.children[0].classList).toContain('mdc-button__ripple'); + expect(hasRipple(button)).toBe(true, 'the ripple element should be attached'); + expect(button.children[1].classList).toContain('mdc-button__label'); })); - it('should have button and ripple styling', fakeAsync(() => { + it('should style according to the value of the unelevated property', (() => { const { fixture } = setup(); - const button = fixture.nativeElement.querySelector('button'); - expect(button.classList).toContain('mdc-button'); - expect(hasRipple(button)).toBe(true, 'buttons should attach a ripple by default'); + testStyle(fixture, 'unelevated', 'unelevated', 'mdc-button--unelevated', MdcButtonDirective, TestComponent); })); it('should style according to the value of the raised property', (() => { const { fixture } = setup(); - testStyle(fixture, 'raised', 'mdc-button--raised'); + testStyle(fixture, 'raised', 'raised', 'mdc-button--raised', MdcButtonDirective, TestComponent); })); it('should style according to the value of the outlined property', (() => { const { fixture } = setup(); - testStyle(fixture, 'outlined', 'mdc-button--outlined'); + testStyle(fixture, 'outlined', 'outlined', 'mdc-button--outlined', MdcButtonDirective, TestComponent); })); - it('should style according to the value of the dense property', (() => { - const { fixture } = setup(); - testStyle(fixture, 'dense', 'mdc-button--dense'); + it('should render icon properly', (() => { + const { fixture, testComponent } = setup(); + testComponent.materialIcon = 'bookmark'; + fixture.detectChanges(); + const button = fixture.nativeElement.querySelector('button'); + const icon: HTMLElement = button.children[1]; + expect(icon.classList).toContain('mdc-button__icon'); + expect(icon.attributes.getNamedItem('aria-hidden')).not.toBeNull(); })); - const testStyle = (fixture: ComponentFixture, property: string, style: string) => { - const button = fixture.debugElement.query(By.directive(MdcButtonDirective)).injector.get(MdcButtonDirective); + @Component({ + template: ` + + ` + }) + class TestComponent { + unelevated: any = null; + raised: any = null; + outlined: any = null; + materialIcon: any = null; + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcButtonDirective, MdcButtonIconDirective, MdcButtonLabelDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); const testComponent = fixture.debugElement.injector.get(TestComponent); - // initial the styles are not set: - expect(button[property]).toBe(false); - expect(button._elm.nativeElement.classList.contains(style)).toBe(false); - // test various ways to set the property value, and the result of having the class or not: - booleanAttributeStyleTest(fixture, testComponent, button, property, property, style); + return { fixture, testComponent }; } }); diff --git a/bundle/src/components/button/mdc.button.directive.ts b/bundle/src/components/button/mdc.button.directive.ts index bde2da0..093adde 100644 --- a/bundle/src/components/button/mdc.button.directive.ts +++ b/bundle/src/components/button/mdc.button.directive.ts @@ -1,5 +1,5 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2, forwardRef } from '@angular/core'; -import { MDCRipple } from '@material/ripple'; +import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2, forwardRef, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; @@ -10,32 +10,54 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; * from Google fonts), or with svg elements for svg based icons. */ @Directive({ - selector: 'mdcButtonIcon' + selector: '[mdcButtonIcon]' }) export class MdcButtonIconDirective { - @HostBinding('class.mdc-button__icon') _cls = true; + /** @internal */ + @HostBinding('class.mdc-button__icon') readonly _cls = true; + /** @internal */ @HostBinding('attr.aria-hidden') _ariaHidden = true; } +/** + * Directive for the label of an mdcButton. Must be a direct child + * of mdcButton. + */ +@Directive({ + selector: '[mdcButtonLabel]' +}) +export class MdcButtonLabelDirective { + /** @internal */ + @HostBinding('class.mdc-button__label') readonly _cls = true; +} + /** * Material design button. Anchors can also be styled as buttons with this directive. * Defaults to a button that is flushed with the surface. * Use the input modifiers to alter the styling, or create your own style * based on the provided sass-mixins. + * + * For buttons with a trailing icon, you must put the label inside an `mdcButtonLabel` + * directive. For all other buttons it is also recommnded to put the label inside + * an `mdcButtonLabel`, because future version of material-components-web may make + * it's use mandatory. + * + * A ripple (and the required DOM elements for the ripple) will be added automatically. */ @Directive({ selector: 'button[mdcButton],a[mdcButton]', providers: [{provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcButtonDirective) }] }) export class MdcButtonDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-button') _cls = true; - private _dense = false; + /** @internal */ + @HostBinding('class.mdc-button') readonly _cls = true; private _raised = false; private _unelevated = false; private _outlined = false; - constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry) { - super(_elm, renderer, registry); + constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, renderer, registry, doc as Document); + this.addRippleSurface('mdc-button__ripple'); } ngAfterContentInit() { @@ -55,10 +77,12 @@ export class MdcButtonDirective extends AbstractMdcRipple implements AfterConten return this._raised; } - set raised(val: any) { + set raised(val: boolean) { this._raised = asBoolean(val); } + static ngAcceptInputType_raised: boolean | ''; + /** * When this input is defined and does not have value false, the button will be styled * flush with the surface and have a visible border. @@ -68,10 +92,12 @@ export class MdcButtonDirective extends AbstractMdcRipple implements AfterConten return this._outlined; } - set outlined(val: any) { + set outlined(val: boolean) { this._outlined = asBoolean(val); } + static ngAcceptInputType_outlined: boolean | ''; + /** * Set this property to a non false value for a contained button * flush with the surface. @@ -81,20 +107,15 @@ export class MdcButtonDirective extends AbstractMdcRipple implements AfterConten return this._unelevated; } - set unelevated(val: any) { + set unelevated(val: boolean) { this._unelevated = asBoolean(val); } - /** - * When this input is defined and does not have value false, the button text is compressed - * to make it slightly smaller. - */ - @HostBinding('class.mdc-button--dense') @Input() - get dense() { - return this._dense; - } - - set dense(val: any) { - this._dense = asBoolean(val); - } + static ngAcceptInputType_unelevated: boolean | ''; } + +export const BUTTON_DIRECTIVES = [ + MdcButtonIconDirective, + MdcButtonLabelDirective, + MdcButtonDirective +]; diff --git a/bundle/src/components/card/mdc.card.directive.ts b/bundle/src/components/card/mdc.card.directive.ts index 8674478..84d87a6 100644 --- a/bundle/src/components/card/mdc.card.directive.ts +++ b/bundle/src/components/card/mdc.card.directive.ts @@ -1,5 +1,6 @@ -import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, Input, OnDestroy, +import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, Inject, Input, OnDestroy, QueryList, Renderer2 } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcIcon } from '../icon-button/abstract.mdc.icon'; import { MdcButtonDirective } from '../button/mdc.button.directive'; @@ -17,15 +18,18 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; selector: '[mdcCardMedia]', }) export class MdcCardMediaDirective { - @HostBinding('class.mdc-card__media') _cls = true; + /** @internal */ + @HostBinding('class.mdc-card__media') readonly _cls = true; private _size: 'cover' | '16:9' | 'square' = 'cover'; constructor() {} + /** @internal */ @HostBinding('class.mdc-card__media--square') get _square() { return this._size === 'square'; } + /** @internal */ @HostBinding('class.mdc-card__media--16-9') get _size2() { return this._size === '16:9'; } @@ -53,9 +57,8 @@ export class MdcCardMediaDirective { selector: '[mdcCardMediaContent]' }) export class MdcCardMediaContentDirective { - @HostBinding('class.mdc-card__media-content') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-card__media-content') readonly _cls = true; } /** @@ -67,9 +70,8 @@ export class MdcCardMediaContentDirective { selector: '[mdcCardActionButtons]' }) export class MdcCardActionButtonsDirective { - @HostBinding('class.mdc-card__action-buttons') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-card__action-buttons') readonly _cls = true; } /** @@ -81,9 +83,8 @@ export class MdcCardActionButtonsDirective { selector: '[mdcCardActionIcons]' }) export class MdcCardActionIconsDirective { - @HostBinding('class.mdc-card__action-icons') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-card__action-icons') readonly _cls = true; } /** @@ -96,9 +97,12 @@ export class MdcCardActionIconsDirective { selector: '[mdcCardActions]', }) export class MdcCardActionsDirective implements AfterContentInit { - @HostBinding('class.mdc-card__actions') _cls = true; - @ContentChildren(MdcButtonDirective, {descendants: true}) _buttons: QueryList; - @ContentChildren(AbstractMdcIcon, {descendants: true}) _icons: QueryList; + /** @internal */ + @HostBinding('class.mdc-card__actions') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcButtonDirective, {descendants: true}) _buttons?: QueryList; + /** @internal */ + @ContentChildren(AbstractMdcIcon, {descendants: true}) _icons?: QueryList; private _initialized = false; private _fullBleed = false; @@ -108,17 +112,17 @@ export class MdcCardActionsDirective implements AfterContentInit { this._initialized = true; this._initButtons(); this._initIcons(); - this._buttons.changes.subscribe(() => { + this._buttons!.changes.subscribe(() => { this._initButtons(); }); - this._icons.changes.subscribe(() => { + this._icons!.changes.subscribe(() => { this._initIcons(); }) } private _initButtons() { if (this._initialized) - this._buttons.forEach(btn => { + this._buttons!.forEach(btn => { this.renderer.addClass(btn._elm.nativeElement, 'mdc-card__action'); this.renderer.addClass(btn._elm.nativeElement, 'mdc-card__action--button'); }); @@ -126,7 +130,7 @@ export class MdcCardActionsDirective implements AfterContentInit { private _initIcons() { if (this._initialized) - this._icons.forEach(icon => { + this._icons!.forEach(icon => { this.renderer.addClass(icon._elm.nativeElement, 'mdc-card__action'); this.renderer.addClass(icon._elm.nativeElement, 'mdc-card__action--icon'); }); @@ -142,9 +146,11 @@ export class MdcCardActionsDirective implements AfterContentInit { return this._fullBleed; } - set fullBleed(val: any) { + set fullBleed(val: boolean) { this._fullBleed = asBoolean(val); } + + static ngAcceptInputType_fullBleed: boolean | ''; } /** @@ -156,13 +162,17 @@ export class MdcCardActionsDirective implements AfterContentInit { selector: '[mdcCardPrimaryAction]', }) export class MdcCardPrimaryActionDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-card__primary-action') _cls = true; + /** @internal */ + @HostBinding('class.mdc-card__primary-action') readonly _cls = true; - constructor(elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry) { - super(elm, renderer, registry); + constructor(private elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(elm, renderer, registry, doc as Document); } ngAfterContentInit() { + if (!this.elm.nativeElement.hasAttribute('tabindex')) + // unless overridden, make the action tabbable: + this.elm.nativeElement.tabIndex = 0; this.initRipple(); } @@ -179,11 +189,10 @@ export class MdcCardPrimaryActionDirective extends AbstractMdcRipple implements selector: '[mdcCard]' }) export class MdcCardDirective { - @HostBinding('class.mdc-card') _cls = true; + /** @internal */ + @HostBinding('class.mdc-card') readonly _cls = true; private _outlined = false; - constructor() {} - /** * When this input is set to a value other than false, the card will have a * hairline stroke instead of a shadow. @@ -193,7 +202,19 @@ export class MdcCardDirective { return this._outlined; } - set outlined(val: any) { + set outlined(val: boolean) { this._outlined = asBoolean(val); } + + static ngAcceptInputType_outlined: boolean | ''; } + +export const CARD_DIRECTIVES = [ + MdcCardMediaDirective, + MdcCardMediaContentDirective, + MdcCardActionButtonsDirective, + MdcCardActionIconsDirective, + MdcCardActionsDirective, + MdcCardPrimaryActionDirective, + MdcCardDirective +]; \ No newline at end of file diff --git a/bundle/src/components/checkbox/mdc.checkbox.adapter.ts b/bundle/src/components/checkbox/mdc.checkbox.adapter.ts deleted file mode 100644 index 2a45d73..0000000 --- a/bundle/src/components/checkbox/mdc.checkbox.adapter.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** @docs-private */ -export interface MdcCheckboxAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - setNativeControlAttr: (attr: string, value: string) => void, - removeNativeControlAttr: (attr: string) => void, - registerAnimationEndHandler: (handler: EventListener) => void; - deregisterAnimationEndHandler: (handler: EventListener) => void; - registerChangeHandler: (handler: EventListener) => void; - deregisterChangeHandler: (handler: EventListener) => void; - getNativeControl: () => HTMLInputElement; - forceLayout: () => void; - isAttachedToDOM: () => boolean; -} diff --git a/bundle/src/components/checkbox/mdc.checkbox.directive.spec.ts b/bundle/src/components/checkbox/mdc.checkbox.directive.spec.ts new file mode 100644 index 0000000..b258331 --- /dev/null +++ b/bundle/src/components/checkbox/mdc.checkbox.directive.spec.ts @@ -0,0 +1,322 @@ +import { TestBed, fakeAsync, ComponentFixture, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { MdcCheckboxInputDirective, MdcCheckboxDirective } from './mdc.checkbox.directive'; +import { hasRipple } from '../../testutils/page.test'; +import { By } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; + +describe('MdcCheckBoxDirective', () => { + it('should render the checkbox with ripple and label', fakeAsync(() => { + const { fixture } = setup(); + const root = fixture.nativeElement.querySelector('.mdc-checkbox'); + expect(root.children.length).toBe(3); + expect(root.children[0].classList).toContain('mdc-checkbox__ripple'); + expect(root.children[1].classList).toContain('mdc-checkbox__native-control'); + expect(root.children[2].classList).toContain('mdc-checkbox__background'); + expect(hasRipple(root)).toBe(true, 'the ripple element should be attached'); + })); + + it('checked can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.checked).toBe(null); + expect(element.checked).toBe(false); + setAndCheck(fixture, 'yes', true); + setAndCheck(fixture, 1, true); + setAndCheck(fixture, true, true); + setAndCheck(fixture, 'false', false); + setAndCheck(fixture, '0', true); + setAndCheck(fixture, false, false); + setAndCheck(fixture, 0, true); + setAndCheck(fixture, null, false); + setAndCheck(fixture, '', true); + })); + + it('indeterminate can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.indeterminate).toBe(null); + expect(element.indeterminate).toBe(false); + setAndCheckIndeterminate(fixture, 'yes', true); + setAndCheckIndeterminate(fixture, 'false', false); + setAndCheckIndeterminate(fixture, 1, true); + setAndCheckIndeterminate(fixture, false, false); + setAndCheckIndeterminate(fixture, true, true); + setAndCheckIndeterminate(fixture, null, false); + setAndCheckIndeterminate(fixture, '0', true); + })); + + it('checked can be set by user, indeterminate can be unset by user', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + expect(element.checked).toBe(false); + expect(element.indeterminate).toBe(false); + clickAndCheck(fixture, true, false); + clickAndCheck(fixture, false, false); + clickAndCheck(fixture, true, false); + + // indeterminate should switch to false on click: + testComponent.indeterminate = true; + fixture.detectChanges(); + expect(input.indeterminate).toBe(true); + expect(element.indeterminate).toBe(true); + // clicking should set indeterminate to false again: + clickAndCheck(fixture, false, false); + })); + + it('can be disabled', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + testComponent.disabled = true; + fixture.detectChanges(); tick(20); // wait for requestAnimationFrame handling + expect(element.disabled).toBe(true); + expect(input.disabled).toBe(true); + expect(testComponent.disabled).toBe(true); + const checkbox = fixture.debugElement.query(By.directive(MdcCheckboxDirective)).injector.get(MdcCheckboxDirective); + expect(checkbox['isRippleSurfaceDisabled']()).toBe(true); + expect(checkbox['root'].nativeElement.classList).toContain('mdc-checkbox--disabled'); + + testComponent.disabled = false; + fixture.detectChanges(); + expect(element.disabled).toBe(false); + expect(input.disabled).toBe(false); + expect(testComponent.disabled).toBe(false); + expect(checkbox['isRippleSurfaceDisabled']()).toBe(false); + expect(checkbox['root'].nativeElement.classList).not.toContain('mdc-checkbox--disabled'); + })); + + it('native input can be changed dynamically', fakeAsync(() => { + const { fixture, testComponent, input } = setup(TestComponentDynamicInput); + + let elements = fixture.nativeElement.querySelectorAll('.mdc-checkbox__native-control'); + // when no input is present the mdcCheckbox renders without an initialized foundation: + expect(elements.length).toBe(0); + + let check = false; + for (let i = 0; i != 3; ++i) { + // render/include one of the inputs: + testComponent.input = i; + fixture.detectChanges(); + // the input should be recognized, the foundation is (re)initialized, + // so we have a fully functional mdcICheckbox now: + elements = fixture.nativeElement.querySelectorAll('.mdc-checkbox__native-control'); + expect(elements.length).toBe(1); + expect(elements[0].classList).toContain('mdc-checkbox__native-control'); + expect(elements[0].id).toBe(`i${i}`); + // the value of the native input is correctly synced with the testcomponent: + expect(elements[0].checked).toBe(check); + // change the value for the next iteration: + check = !check; + testComponent.checked = check; + fixture.detectChanges(); + expect(elements[0].checked).toBe(check); + } + + // removing input should also work: + testComponent.input = null; + fixture.detectChanges(); + elements = fixture.nativeElement.querySelectorAll('.mdc-checkbox__native-control'); + // when no input is present the mdcCheckbox renders without an initialized foundation: + expect(elements.length).toBe(0); + expect(testComponent.checked).toBe(check); + })); + + it('user interactions are registered in the absence of template bindings', fakeAsync(() => { + const { fixture, element, input } = setup(TestComponentNoBindings); + + expect(element.checked).toBe(false); + expect(input.checked).toBe(false); + expect(element.indeterminate).toBe(false); + expect(input.indeterminate).toBe(false); + clickAndCheckNb(true); + clickAndCheckNb(false); + input.indeterminate = true; + fixture.detectChanges(); + expect(element.indeterminate).toBe(true); + clickAndCheckNb(true); + + function clickAndCheckNb(expected) { + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + expect(element.indeterminate).toBe(false); + expect(input.indeterminate).toBe(false); + } + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expected: boolean) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective))?.injector.get(MdcCheckboxInputDirective); + testComponent.checked = value; + fixture.detectChanges(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + } + + function setAndCheckIndeterminate(fixture: ComponentFixture, value: any, expected: boolean) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective))?.injector.get(MdcCheckboxInputDirective); + testComponent.indeterminate = value; + fixture.detectChanges(); + expect(element.indeterminate).toBe(expected); + expect(input.indeterminate).toBe(expected); + } + + function clickAndCheck(fixture: ComponentFixture, expected: boolean, expectIndeterminate: any) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective))?.injector.get(MdcCheckboxInputDirective); + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + expect(testComponent.checked).toBe(expected); + expect(element.indeterminate).toBe(false); + expect(input.indeterminate).toBe(false); + expect(testComponent.indeterminate).toBe(false); + } + + @Component({ + template: ` +
+ +
+ ` + }) + class TestComponent { + checked: any = null; + indeterminate: any = null; + disabled: any = null; + onClick() { + this.checked = !this.checked; + this.indeterminate = false; + } + } + + @Component({ + template: ` +
+ +
+ ` + }) + class TestComponentNoBindings { + } + + @Component({ + template: ` +
+ + + +
+ ` + }) + class TestComponentDynamicInput { + input: number = null; + checked: any = null; + indeterminate: any = null; + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcCheckboxInputDirective, MdcCheckboxDirective, compType] + }).createComponent(compType); + fixture.detectChanges(); + const testComponent = fixture.debugElement.injector.get(compType); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective))?.injector.get(MdcCheckboxInputDirective); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + return { fixture, testComponent, input, element }; + } +}); + +describe('MdcCheckBoxDirective with FormsModule', () => { + it('ngModel can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.value).toBe(null); + expect(element.checked).toBe(false); + expect(element.indeterminate).toBe(true); + + // Note that binding to 'ngModel' behaves slightly different from binding to 'checked' + // ngModel coerces values the javascript way: it does !!bindedValue + // checked coerces the string-safe way: value != null && `${value}` !== 'false' + setAndCheck(fixture, 'yes', true); + setAndCheck(fixture, false, false); + setAndCheck(fixture, 'false', true); // the way it works for ngModel... + setAndCheck(fixture, null, false); + setAndCheck(fixture, 1, true); + setAndCheck(fixture, 0, false); + setAndCheck(fixture, '0', true); + })); + + it('ngModel can be changed by updating checked property', fakeAsync(() => { + const { fixture, testComponent, input } = setup(); + + input.checked = true; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(true); + + input.checked = false; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(false); + })); + + it('ngModel can be changed by user', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(true); + expect(input.checked).toBe(true); + expect(testComponent.value).toBe(true); + expect(testComponent.indeterminate).toBe(false); + + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(false); + expect(input.checked).toBe(false); + expect(testComponent.value).toBe(false); + expect(testComponent.indeterminate).toBe(false); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expectedValue: boolean) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective)).injector.get(MdcCheckboxInputDirective); + testComponent.value = value; + fixture.detectChanges(); tick(); + expect(input.checked).toBe(expectedValue); + expect(element.checked).toBe(expectedValue); + expect(testComponent.value).toBe(value); + expect(input.indeterminate).toBe(value == null); + expect(element.indeterminate).toBe(value == null); + } + + @Component({ + template: ` +
+ +
+ ` + }) + class TestComponent { + value: any = null; + get indeterminate() { + return this.value == null; + } + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + imports: [FormsModule], + declarations: [MdcCheckboxInputDirective, MdcCheckboxDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); + tick(); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const input = fixture.debugElement.query(By.directive(MdcCheckboxInputDirective)).injector.get(MdcCheckboxInputDirective); + const element = fixture.nativeElement.querySelector('.mdc-checkbox__native-control'); + return { fixture, testComponent, input, element }; + } +}); diff --git a/bundle/src/components/checkbox/mdc.checkbox.directive.ts b/bundle/src/components/checkbox/mdc.checkbox.directive.ts index 486e608..aaf72a6 100644 --- a/bundle/src/components/checkbox/mdc.checkbox.directive.ts +++ b/bundle/src/components/checkbox/mdc.checkbox.directive.ts @@ -1,8 +1,10 @@ -import { AfterContentInit, Component, ContentChild, Directive, ElementRef, EventEmitter, HostBinding, HostListener, - Input, OnDestroy, OnInit, Optional, Output, Provider, Renderer2, Self, ViewChild, ViewEncapsulation, forwardRef } from '@angular/core'; +import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, OnInit, Optional, Renderer2, + Self, forwardRef, HostListener, Output, EventEmitter, ContentChildren, QueryList, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { NgControl } from '@angular/forms'; -import { MDCCheckboxFoundation } from '@material/checkbox'; -import { MdcCheckboxAdapter } from './mdc.checkbox.adapter'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { MDCCheckboxFoundation, MDCCheckboxAdapter } from '@material/checkbox'; import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; import { asBoolean } from '../../utils/value.utils'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; @@ -15,33 +17,115 @@ import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; selector: 'input[mdcCheckboxInput][type=checkbox]', providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcCheckboxInputDirective) }] }) -export class MdcCheckboxInputDirective extends AbstractMdcInput { - @HostBinding('class.mdc-checkbox__native-control') _cls = true; - private _id: string; +export class MdcCheckboxInputDirective extends AbstractMdcInput implements OnInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-checkbox__native-control') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + private _id: string | null = null; private _disabled = false; + private _checked = false; + private _indeterminate = false; + /** @internal */ + @Output() readonly _checkedChange: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly _indeterminateChange: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly _disabledChange: EventEmitter = new EventEmitter(); constructor(public _elm: ElementRef, @Optional() @Self() public _cntr: NgControl) { super(); } + ngOnInit() { + this._cntr?.valueChanges!.pipe(takeUntil(this.onDestroy$)).subscribe((value) => { + this.updateValue(value, true); + }); + } + + ngOnDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); + } + /** @docs-private */ @HostBinding() @Input() get id() { return this._id; } - set id(value: string) { + set id(value: string | null) { this._id = value; } /** @docs-private */ @HostBinding() @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; + return this._cntr ? !!this._cntr.disabled : this._disabled; + } + + set disabled(value: boolean) { + const newVal = asBoolean(value); + if (newVal != this._disabled) { + this._disabled = asBoolean(newVal); + this._disabledChange.emit(newVal); + } } - set disabled(value: any) { - this._disabled = asBoolean(value); + static ngAcceptInputType_disabled: boolean | ''; + + /** @docs-private */ + @HostBinding() + @Input() get checked(): boolean { + return this._checked; + } + + set checked(value: boolean) { + this.updateValue(value, false); + } + + static ngAcceptInputType_checked: boolean | ''; + + private updateValue(value: any, fromControl: boolean) { + // When the 'checked' property is the source of the change, we want to coerce boolean + // values using asBoolean, so that initializing with an attribute with no value works + // as expected. + // When the NgControl is the source of the change we don't want that. The value should + // be interpreted like NgControl/NgForms handles non-boolean values when binding. + const newVal = fromControl ? !!value : asBoolean(value); + if (newVal !== this._checked) { + this._checked = newVal; + this._checkedChange.emit(newVal); + } + if (!fromControl && this._cntr && newVal !== this._cntr.value) { + this._cntr.control!.setValue(newVal); + } + } + + /** @docs-private */ + @HostBinding() + @Input() get indeterminate() { + return this._indeterminate; + } + + set indeterminate(value: boolean) { + const newVal = asBoolean(value); + if (newVal !== this._indeterminate) { + this._indeterminate = newVal; + Promise.resolve().then(() => this._indeterminateChange.emit(newVal)); + } + } + + static ngAcceptInputType_indeterminate: boolean | ''; + + // We listen to click-event instead of change-event, because IE doesn't fire the + // change-event when an indeterminate checkbox is clicked. There's no need to + // also listen to change-events. + @HostListener('click') _onChange() { + // only update the checked state from click if there is no control for which we already + // listen to value changes: + if (!this._cntr) + this.checked = this._elm.nativeElement.checked; + this.indeterminate = this._elm.nativeElement.indeterminate; } } @@ -50,93 +134,118 @@ export class MdcCheckboxInputDirective extends AbstractMdcInput { * underlying native checkbox input, which must use the MdcCheckboxInputDirective * directive. * The current implementation will add all other required DOM elements (such as the - * background). + * background and ripple). * Future implementations will also support supplying (customized) background * elements. * * This directive can be used together with an mdcFormField to * easily position checkboxes and their labels, see - * mdcFormField. + * mdcFormField. */ @Directive({ selector: '[mdcCheckbox]' }) export class MdcCheckboxDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-checkbox') _cls = true; - @ContentChild(MdcCheckboxInputDirective) _input: MdcCheckboxInputDirective; - private mdcAdapter: MdcCheckboxAdapter = { - addClass: (className: string) => { - this.renderer.addClass(this.root.nativeElement, className); - }, - removeClass: (className: string) => { - this.renderer.removeClass(this.root.nativeElement, className); - }, - setNativeControlAttr: (attr: string, value: string) => this._renderer.setAttribute(this._input._elm.nativeElement, attr, value), - removeNativeControlAttr: (attr: string) => this._renderer.removeAttribute(this._input._elm.nativeElement, attr), - registerAnimationEndHandler: (handler: EventListener) => { - this.registry.listen(this.renderer, 'animationend', handler, this.root); - }, - deregisterAnimationEndHandler: (handler: EventListener) => { - this.registry.unlisten('animationend', handler); - }, - registerChangeHandler: (handler: EventListener) => { - if (this._input) - this.registry.listen(this.renderer, 'change', handler, this._input._elm); - }, - deregisterChangeHandler: (handler: EventListener) => { - if (this._input) - this.registry.unlisten('change', handler); - }, - getNativeControl: () => this._input ? this._input._elm.nativeElement : null, + /** @internal */ + @HostBinding('class.mdc-checkbox') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + private onInputChange$: Subject = new Subject(); + /** @internal */ + @ContentChildren(MdcCheckboxInputDirective) _inputs?: QueryList; + private mdcAdapter: MDCCheckboxAdapter = { + addClass: (className: string) => this._renderer.addClass(this.root.nativeElement, className), + removeClass: (className: string) => this._renderer.removeClass(this.root.nativeElement, className), + setNativeControlAttr: (attr: string, value: string) => this._renderer.setAttribute(this._input!._elm.nativeElement, attr, value), + removeNativeControlAttr: (attr: string) => this._renderer.removeAttribute(this._input!._elm.nativeElement, attr), forceLayout: () => this.root.nativeElement.offsetWidth, // force layout isAttachedToDOM: () => !!this._input, + hasNativeControl: () => !!this._input, + isChecked: () => this._input!._elm.nativeElement.checked, + isIndeterminate: () => this._input!._elm.nativeElement.indeterminate, + setNativeControlDisabled: (disabled: boolean) => this._input!.disabled = disabled }; - private foundation: { init: Function, destroy: Function } = new MDCCheckboxFoundation(this.mdcAdapter); + /** @internal */ + _foundation: MDCCheckboxFoundation | null = null; - constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry) { - super(root, renderer, registry); + constructor(renderer: Renderer2, private root: ElementRef, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(root, renderer, registry, doc as Document); + this.addRippleSurface('mdc-checkbox__ripple'); } ngAfterContentInit() { - this.addBackground(); - this.initRipple(); - this.foundation.init(); + MdcCheckboxDirective.addBackground(this._rippleElm, this._renderer); + this.initRipple(true); + if (this._input) { + this._foundation = new MDCCheckboxFoundation(this.mdcAdapter); + this._foundation.init(); + } + this._inputs!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + this.reinitRipple(); + if (this._foundation) + this._foundation.destroy(); + if (this._input) { + this._foundation = new MDCCheckboxFoundation(this.mdcAdapter); + this._foundation.init(); + } else + this._foundation = null; + this.subscribeInputChanges(); + }); + this.subscribeInputChanges(); } ngOnDestroy() { - this.foundation.destroy(); + this.onInputChange$.next(); this.onInputChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + if (this._foundation) { + this._foundation.destroy(); + this._foundation = null; + } this.destroyRipple(); } - private addBackground() { - let path = this.renderer.createElement('path', 'svg'); - this.renderer.addClass(path, 'mdc-checkbox__checkmark-path'); - this.renderer.setAttribute(path, 'fill', 'none'); - this.renderer.setAttribute(path, 'd', 'M1.73,12.91 8.1,19.28 22.79,4.59'); - let svg = this.renderer.createElement('svg', 'svg'); - this.renderer.appendChild(svg, path); - this.renderer.addClass(svg, 'mdc-checkbox__checkmark'); - this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24'); - let mixedmark = this.renderer.createElement('div'); - this.renderer.addClass(mixedmark, 'mdc-checkbox__mixedmark'); - let bg = this.renderer.createElement('div'); - this.renderer.appendChild(bg, svg); - this.renderer.appendChild(bg, mixedmark); - this.renderer.addClass(bg, 'mdc-checkbox__background'); - this.renderer.appendChild(this.root.nativeElement, bg); + private subscribeInputChanges() { + this.onInputChange$.next(); + this._input?._indeterminateChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(() => this._foundation?.handleChange()); + this._input?._checkedChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(() => this._foundation?.handleChange()); + this._input?._disabledChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(val => this._foundation?.setDisabled(val)); } - /** @docs-private */ + private static addBackground(elm: ElementRef, renderer: Renderer2) { + let path = renderer.createElement('path', 'svg'); + renderer.addClass(path, 'mdc-checkbox__checkmark-path'); + renderer.setAttribute(path, 'fill', 'none'); + renderer.setAttribute(path, 'd', 'M1.73,12.91 8.1,19.28 22.79,4.59'); + let svg = renderer.createElement('svg', 'svg'); + renderer.appendChild(svg, path); + renderer.addClass(svg, 'mdc-checkbox__checkmark'); + renderer.setAttribute(svg, 'viewBox', '0 0 24 24'); + let mixedmark = renderer.createElement('div'); + renderer.addClass(mixedmark, 'mdc-checkbox__mixedmark'); + let bg = renderer.createElement('div'); + renderer.appendChild(bg, svg); + renderer.appendChild(bg, mixedmark); + renderer.addClass(bg, 'mdc-checkbox__background'); + renderer.appendChild(elm.nativeElement, bg); + } + + /** @internal */ protected getRippleInteractionElement() { - return this._input ? this._input._elm : null; + return this._input?._elm; } - /** @docs-private */ - protected isRippleUnbounded() { - return true; + /** @internal */ + @HostListener('animationend') + onAnimationEnd() { + this._foundation?.handleAnimationEnd(); } - @HostBinding('class.mdc-checkbox--disabled') get _disabled() { - return this._input == null || this._input.disabled; + /** @internal */ + get _input() { + return this._inputs && this._inputs.length > 0 ? this._inputs.first : null; } } + +export const CHECKBOX_DIRECTIVES = [ + MdcCheckboxInputDirective, + MdcCheckboxDirective +]; diff --git a/bundle/src/components/chips/mdc.chip-set.adapter.ts b/bundle/src/components/chips/mdc.chip-set.adapter.ts deleted file mode 100644 index 8aa7b96..0000000 --- a/bundle/src/components/chips/mdc.chip-set.adapter.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** @docs-private */ -export interface MdcChipSetAdapter { - hasClass: (className: string) => boolean, - registerInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterInteractionHandler: (evtType: string, handler: EventListener) => void, - removeChip: (chip: any) => void -} diff --git a/bundle/src/components/chips/mdc.chip.adapter.ts b/bundle/src/components/chips/mdc.chip.adapter.ts deleted file mode 100644 index ab17569..0000000 --- a/bundle/src/components/chips/mdc.chip.adapter.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** @docs-private */ -export interface MdcChipAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - hasClass: (className: string) => boolean, - addClassToLeadingIcon: (className: string) => void, - removeClassFromLeadingIcon: (className: string) => void, - eventTargetHasClass: (target: EventTarget, className: string) => boolean, - registerEventHandler: (evtType: string, handler: EventListener) => void, - deregisterEventHandler: (evtType: string, handler: EventListener) => void, - registerTrailingIconInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterTrailingIconInteractionHandler: (evtType: string, handler: EventListener) => void, - notifyInteraction: () => void, - notifyTrailingIconInteraction: () => void, - notifyRemoval: () => void, - getComputedStyleValue: (propertyName: string) => string, - setStyleProperty: (propertyName: string, value: string) => void -} diff --git a/bundle/src/components/chips/mdc.chip.directive.spec.ts b/bundle/src/components/chips/mdc.chip.directive.spec.ts index c7f91d1..d90d9b9 100644 --- a/bundle/src/components/chips/mdc.chip.directive.spec.ts +++ b/bundle/src/components/chips/mdc.chip.directive.spec.ts @@ -1,20 +1,27 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed, fakeAsync, tick } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { Component, DebugElement } from '@angular/core'; +import { Component } from '@angular/core'; import { MdcChipSetDirective, MdcChipDirective, MdcChipIconDirective, CHIP_DIRECTIVES } from './mdc.chip.directive'; -import { booleanAttributeStyleTest, hasRipple } from '../../testutils/page.test'; +import { hasRipple, simulateKey } from '../../testutils/page.test'; describe('MdcChipDirective', () => { @Component({ template: `
event -
{{chip}}
- cancel + + +
{{chip}}
+
+
+ + cancel +
` @@ -50,18 +57,22 @@ describe('MdcChipDirective', () => { declarations: [...CHIP_DIRECTIVES, testComponentType] }).createComponent(testComponentType); fixture.detectChanges(); - return { fixture }; + const testComponent = fixture.debugElement.injector.get(testComponentType); + const chipSetComponent = fixture.debugElement.query(By.directive(MdcChipSetDirective)).injector.get(MdcChipSetDirective); + const chipSet: HTMLElement = fixture.nativeElement.querySelector('#set'); + return { fixture, testComponent, chipSetComponent, chipSet }; } it('apply correct styles for chip and chip-set', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); - const chipSet: HTMLElement = fixture.nativeElement.querySelector('#set'); + const { fixture, testComponent, chipSet } = setup(); expect(chipSet.classList).toContain('mdc-chip-set'); const chips = chipSet.querySelectorAll('.mdc-chip'); expect(chips.length).toBe(3); + // only one chip/interactionIcon should be tabbable at a time: + expect(chipSet.querySelectorAll('[tabindex]:not([tabindex="-1"])').length).toBe(1); for (let i = 0; i !== chips.length; ++i) { - let icons = chips.item(i).querySelectorAll('i'); + expect(chips.item(i).classList.contains('mdc-chip--deletable')).toBe(true); + const icons = chips.item(i).querySelectorAll('i'); expect(icons.length).toBe(0); } testComponent.includeLeadingIcon = true; @@ -85,12 +96,21 @@ describe('MdcChipDirective', () => { expect(hasRipple(chips.item(i))).toBe(true); })); - it('chipset type is one of choice, filter, input, or action', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); - const chipSetComponent = fixture.debugElement.query(By.directive(MdcChipSetDirective)).injector.get(MdcChipSetDirective); - const chipSet: HTMLElement = fixture.nativeElement.querySelector('#set'); + it('chips get values (either via binding or auto-assigned)', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.chips = ['one', '__two', 'three']; + fixture.detectChanges(); + // for some weird reason this returns every MdcChipDirective twice, hence the construct to remove duplicates: + const chipComponents = fixture.debugElement.queryAll(By.directive(MdcChipDirective)).map(de => de.injector.get(MdcChipDirective)) + .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); + expect(chipComponents.length).toBe(3); + expect(chipComponents[0].value).toBe('one'); + expect(chipComponents[1].value).toMatch(/mdc-chip-.*/); + expect(chipComponents[2].value).toBe('three'); + })); + it('chipset type is one of choice, filter, input, or action', (() => { + const { fixture, testComponent, chipSetComponent, chipSet } = setup(); expect(chipSetComponent.mdcChipSet).toBe('action'); expect(chipSet.getAttribute('class')).toBe('mdc-chip-set'); @@ -107,44 +127,49 @@ describe('MdcChipDirective', () => { expect(chipSet.getAttribute('class')).toBe('mdc-chip-set'); })); - it('trailing icons get a tabindex and role=button', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); - testComponent.chips = ['chip']; + it('trailing icons get a role=button and are navigatable', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.chips = ['chip1', 'chip2']; testComponent.includeLeadingIcon = true; testComponent.includeTrailingIcon = true; - fixture.detectChanges(); - let icons = fixture.nativeElement.querySelectorAll('i'); - expect(icons.length).toBe(2); - expect(icons[0].tabIndex).toBe(-1); - expect(icons[0].hasAttribute('role')).toBe(false); - expect(icons[1].tabIndex).toBe(0); - expect(icons[1].getAttribute('role')).toBe('button'); + fixture.detectChanges(); tick(); + let primaryActions = [...fixture.nativeElement.querySelectorAll('.mdc-chip__primary-action')]; + expect(primaryActions.length).toBe(2); + expect(primaryActions.map(a => a.tabIndex)).toEqual([0, -1]); + let icons = [...fixture.nativeElement.querySelectorAll('i')]; + expect(icons.length).toBe(4); + expect(icons.map(i => i.tabIndex)).toEqual([-1, -1, -1, -1]); + expect(icons.map(i => i.getAttribute('role'))).toEqual([null, 'button', null, 'button']); + + // ArrowRight/ArrowLeft changes focus and tabbable item: + primaryActions[0].focus(); + simulateKey(primaryActions[0], 'ArrowRight'); + // trailing action of first chip now is tabbable and has focus: + expect(document.activeElement).toBe(icons[1]); + expect(primaryActions.map(a => a.tabIndex)).toEqual([-1, -1]); + expect(icons.map(i => i.tabIndex)).toEqual([-1, 0, -1, -1]); // role/tabIndex changes must be undone when the icon is not a trailing icon anymore: const trailingIcon = fixture.debugElement.queryAll(By.directive(MdcChipIconDirective))[1].injector.get(MdcChipIconDirective); expect(trailingIcon._elm.nativeElement).toBe(icons[1]); trailingIcon._trailing = false; + fixture.detectChanges(); expect(icons[1].tabIndex).toBe(-1); expect(icons[1].hasAttribute('role')).toBe(false); })); it('unreachable code for our implementation must throw errors', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent, chipSetComponent } = setup(); testComponent.chips = ['chip']; fixture.detectChanges(); - const chipSetComponent = fixture.debugElement.query(By.directive(MdcChipSetDirective)).injector.get(MdcChipSetDirective); - expect(() => {chipSetComponent._adapter.removeChip(null); }).toThrowError(); + expect(() => {chipSetComponent._adapter.removeChipAtIndex(null); }).toThrowError(); })); it('click action chip triggers interaction event', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.chips = ['chip']; fixture.detectChanges(); const chip = fixture.nativeElement.querySelector('.mdc-chip'); - const trailingIcon = fixture.nativeElement.querySelector expect(testComponent.interactions).toEqual([]); expect(testComponent.trailingIconInteractions).toEqual([]); @@ -155,8 +180,7 @@ describe('MdcChipDirective', () => { })); it('trailing icon interactions trigger interaction and remove events', fakeAsync(() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'input'; testComponent.chips = ['chip']; testComponent.includeTrailingIcon = true; @@ -178,9 +202,65 @@ describe('MdcChipDirective', () => { expect(testComponent.chips).toEqual([]); })); + it('after chip removal, next remaining chip has focus and is tabbable', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.type = 'input'; + testComponent.chips = ['chip1', 'chip2', 'chip3']; + testComponent.includeTrailingIcon = true; + fixture.detectChanges(); + const chips: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-chip')]; + const primaryActions: HTMLElement[] = chips.map(c => c.querySelector('.mdc-chip__primary-action')); + const trailingIcons: HTMLElement[] = chips.map(c => c.querySelector('i:last-child')); + // for some weird reason this returns every MdcChipDirective twice when executed on Github Actions, + // (it doesn't when run locally with test/test:watch/test:ci, and also doesn't on circleci...), + // hence the construct to remove duplicates: + const chipComponents = fixture.debugElement.queryAll(By.directive(MdcChipDirective)).map(de => de.injector.get(MdcChipDirective)) + .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); + expect(chipComponents.length).toBe(3); + + expect(primaryActions[0].tabIndex).toBe(0); + simulateKey(primaryActions[0], 'ArrowRight'); + expect(trailingIcons[0].tabIndex).toBe(0); + simulateKey(trailingIcons[0], 'ArrowRight'); + expect(primaryActions[1].tabIndex).toBe(0); + simulateKey(primaryActions[1], 'ArrowRight'); + expect(trailingIcons[1].tabIndex).toBe(0); + expect(document.activeElement).toBe(trailingIcons[1]); + trailingIcons[1].click(); + + expect(testComponent.interactions).toEqual([]); + expect(testComponent.trailingIconInteractions).toEqual(['chip2']); + // simulate transitionend event for exit transition of chip: + (chipComponents[1]._foundation).handleTransitionEnd({target: chips[1], propertyName: 'opacity'}); + tick(20); // wait for requestAnimationFrame + (chipComponents[1]._foundation).handleTransitionEnd({target: chips[1], propertyName: 'width'}); + expect(testComponent.chips).toEqual(['chip1', 'chip3']); + expect([...fixture.nativeElement.querySelectorAll('.mdc-chip__primary-action')].map(a => a.tabIndex)).toEqual([-1, -1]); + expect([...fixture.nativeElement.querySelectorAll('.mdc-chip')] + .map(c => c.querySelector('i:last-child').tabIndex)).toEqual([-1, 0]); + expect(document.activeElement).toBe([...fixture.nativeElement.querySelectorAll('.mdc-chip')] + .map(c => c.querySelector('i:last-child'))[1]); + })); + + it('after chip list changes, always exactly one chip or trailingIcon should be tabbable', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.type = 'input'; + testComponent.chips = ['chip1', 'chip2', 'chip3']; + testComponent.includeTrailingIcon = true; + fixture.detectChanges(); + + while (testComponent.chips.length) { + expect(fixture.nativeElement.querySelectorAll('.mdc-chip').length).toBe(testComponent.chips.length); + expect(fixture.nativeElement.querySelectorAll('[tabindex]:not([tabindex="-1"])').length).toBe(1); + testComponent.chips.splice(0, 1); + fixture.detectChanges(); + } + expect(fixture.nativeElement.querySelectorAll('.mdc-chip').length).toBe(0); + expect(fixture.nativeElement.querySelectorAll('[tabindex]:not([tabindex="-1"])').length).toBe(0); + })); + it('filter chips get a checkmark icon on selection', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'filter'; fixture.detectChanges(); const chips = fixture.nativeElement.querySelectorAll('.mdc-chip'); @@ -201,8 +281,7 @@ describe('MdcChipDirective', () => { })); it('filter chips selected value changes on clicks', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'filter'; fixture.detectChanges(); const chips = fixture.nativeElement.querySelectorAll('.mdc-chip'); @@ -219,8 +298,7 @@ describe('MdcChipDirective', () => { })); it('choice chips selected value changes on clicks and clicks of other choices', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'choice'; fixture.detectChanges(); const chips = fixture.nativeElement.querySelectorAll('.mdc-chip'); @@ -236,13 +314,14 @@ describe('MdcChipDirective', () => { expect(testComponent.valueChanges).toEqual([{chip: 'chappie', value: false}]); })); - it('filter/choice chips selected state can be changed', (() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + it('filter/choice chips selected state can be changed', fakeAsync(() => { + const { fixture, testComponent } = setup(); testComponent.type = 'choice'; fixture.detectChanges(); - const chips = fixture.nativeElement.querySelectorAll('.mdc-chip'); - const chipComponents = fixture.debugElement.queryAll(By.directive(MdcChipDirective)).map(de => de.injector.get(MdcChipDirective)); + // for some weird reason this returns every MdcChipDirective twice, hence the construct to remove duplicates: + const chipComponents = fixture.debugElement.queryAll(By.directive(MdcChipDirective)).map(de => de.injector.get(MdcChipDirective)) + .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); + expect(chipComponents.length).toBe(3); expect(chipComponents[0].selected).toBe(false); chipComponents[0].selected = true; @@ -250,7 +329,7 @@ describe('MdcChipDirective', () => { testComponent.valueChanges = []; chipComponents[1].selected = true; - expect(testComponent.valueChanges).toEqual([{chip: 'chippie', value: false}, {chip: 'chappie', value: true}]); + expect(testComponent.valueChanges).toEqual(jasmine.arrayWithExactContents([{chip: 'chippie', value: false}, {chip: 'chappie', value: true}])); expect(chipComponents[0].selected).toBe(false); testComponent.valueChanges = []; @@ -266,8 +345,7 @@ describe('MdcChipDirective', () => { })); it('filter chips hide their leading icon on selection (to make place for the checkmark)', fakeAsync(() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'filter'; testComponent.chips = ['chip']; testComponent.includeLeadingIcon = true; @@ -291,22 +369,24 @@ describe('MdcChipDirective', () => { })); it('computeRippleBoundingRect returns correct values', fakeAsync(() => { - const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, testComponent } = setup(); testComponent.type = 'filter'; testComponent.chips = ['chip']; testComponent.includeLeadingIcon = true; fixture.detectChanges(); let chipComponent = fixture.debugElement.query(By.directive(MdcChipDirective)).injector.get(MdcChipDirective); + let chip = fixture.nativeElement.querySelector('div.mdc-chip'); let rect = chipComponent['computeRippleBoundingRect'](); - expect(rect.width).toBeGreaterThan(rect.height); + expect(rect.height).toBe(32); + expect(rect.width).toBe(chip.getBoundingClientRect().width); testComponent.includeLeadingIcon = false; fixture.detectChanges(); - chipComponent = fixture.debugElement.query(By.directive(MdcChipDirective)).injector.get(MdcChipDirective); + let checkmark = fixture.nativeElement.querySelector('div.mdc-chip__checkmark'); rect = chipComponent['computeRippleBoundingRect'](); - expect(rect.width).toBe(rect.height); + expect(rect.height).toBe(32); + expect(rect.width).toBe(chip.getBoundingClientRect().width + checkmark.getBoundingClientRect().height); })); @Component({ @@ -319,16 +399,19 @@ describe('MdcChipDirective', () => {
{{icon}}
-
{{chip}}
-
-
{{chip}}
-
- - {{icon}} - -
- {{icon}} -
+ + +
{{chip}}
+
+
+ + + {{icon}} + +
+ {{icon}} +
+
` @@ -339,8 +422,7 @@ describe('MdcChipDirective', () => { afterIcons = []; } it('leading/trailing icons are detected properly', (() => { - const { fixture } = setup(TestIconsComponent); - const testComponent = fixture.debugElement.injector.get(TestIconsComponent); + const { fixture, testComponent } = setup(TestIconsComponent); let icons = fixture.nativeElement.querySelectorAll('i'); expect(icons.length).toBe(0); @@ -405,20 +487,137 @@ describe('MdcChipDirective', () => { template: `
-
one
+ event + + +
one
+
+
+ + cancel + +
+
+ event + + +
two
+
+
+ + cancel +
-
-
two
+
+ event + + +
three
+
+
+ + cancel +
` }) class TestTabbingComponent { } - it('chips are tabbable by default, but this can be overridden', (() => { + it('chips trailing icons tabIndex is controlled by chipset, other icons tabindex can be overridden', (() => { const { fixture } = setup(TestTabbingComponent); - let chips = fixture.nativeElement.querySelectorAll('.mdc-chip'); - expect(chips[0].tabIndex).toBe(0); - expect(chips[1].tabIndex).toBe(-1); + let actions = fixture.nativeElement.querySelectorAll('.mdc-chip__primary-action'); + expect(actions[0].tabIndex).toBe(-1); // initial -1, because last chip was initialized with a tabIndex, so that is taken as the first focusable chip + expect(actions[1].tabIndex).toBe(-1); + expect(actions[2].tabIndex).toBe(99); + let trailingIcons = fixture.nativeElement.querySelectorAll('.mdc-chip__icon--trailing'); + expect(trailingIcons[0].tabIndex).toBe(-1); + expect(trailingIcons[1].tabIndex).toBe(-1); + expect(trailingIcons[2].tabIndex).toBe(-1); // because primaryAction is already tabbable + let leadingIcons = fixture.nativeElement.querySelectorAll('.leading'); + expect(leadingIcons[0].tabIndex).toBe(0); // untouched, because leading icon + expect(leadingIcons[1].tabIndex).toBe(-1); + expect(leadingIcons[2].tabIndex).toBe(-1); + })); + + @Component({ + template: ` +
+
+ event + + +
one
+
+
+ + cancel + +
+
+ ` + }) + class TestIconRoleComponent { + } + it('chips icons can override their aria role', (() => { + const { fixture } = setup(TestIconRoleComponent); + let icons = fixture.nativeElement.querySelectorAll('.mdc-chip__icon'); + expect(icons[0].getAttribute('role')).toBe('custom-role'); + expect(icons[1].getAttribute('role')).toBe('custom-role'); + })); + + @Component({ + template: ` +
+
+ + +
{{chip}}
+
+
+ + cancel + +
+
+ ` + }) + class TestNotRemobvableComponent { + chips = ['chippie', 'chappie', 'choppie']; + trailingIconInteractions = []; + removed = []; + trailingIconInteract(chip: string) { + this.trailingIconInteractions.push(chip); + } + resetInteractions() { + this.trailingIconInteractions = []; + } + remove(i: number) { + this.chips.splice(i, 1); + } + } + + it('removable property must prevent removal', fakeAsync(() => { + const { fixture, testComponent } = setup(TestNotRemobvableComponent); + const chips: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-chip')]; + const trailingIcons = fixture.nativeElement.querySelectorAll('.mdc-chip i:last-child'); + // for some weird reason this returns every MdcChipDirective twice, hence the construct to remove duplicates: + const chipComponents = fixture.debugElement.queryAll(By.directive(MdcChipDirective)).map(de => de.injector.get(MdcChipDirective)) + .reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []); + expect(testComponent.trailingIconInteractions).toEqual([]); + expect(chips.map(c => c.classList.contains('mdc-chip--deletable'))).toEqual([false, false, false]); + + trailingIcons[1].click(); + // simulate transitionend event for exit transition of chip: + (chipComponents[1]._foundation).handleTransitionEnd({target: chips[1], propertyName: 'opacity'}); + tick(20); // wait for requestAnimationFrame + (chipComponents[1]._foundation).handleTransitionEnd({target: chips[1], propertyName: 'width'}); + + // there was an interaction: + expect(testComponent.trailingIconInteractions).toEqual(['chappie']); + // but nothing was deleted: + expect(testComponent.chips).toEqual(['chippie', 'chappie', 'choppie']); })); }); diff --git a/bundle/src/components/chips/mdc.chip.directive.ts b/bundle/src/components/chips/mdc.chip.directive.ts index 7f3a67f..beab9d1 100644 --- a/bundle/src/components/chips/mdc.chip.directive.ts +++ b/bundle/src/components/chips/mdc.chip.directive.ts @@ -1,175 +1,281 @@ import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, - OnDestroy,Output, QueryList, Renderer2, ChangeDetectorRef } from '@angular/core'; -import { MDCChipFoundation, MDCChipSetFoundation } from '@material/chips'; + OnDestroy,Output, QueryList, Renderer2, ChangeDetectorRef, HostListener, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { MDCChipAdapter, MDCChipSetAdapter, MDCChipFoundation, MDCChipSetFoundation } from '@material/chips'; +import { EventSource} from '@material/chips/chip/constants'; +import { announce } from '../../utils/thirdparty.announce'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; import { asBoolean } from '../../utils/value.utils'; -import { MdcChipAdapter } from './mdc.chip.adapter'; -import { MdcChipSetAdapter } from './mdc.chip-set.adapter'; import { Subscription } from 'rxjs'; +export enum ChipEventSource { + primary = EventSource.PRIMARY, + trailing = EventSource.TRAILING, + none = EventSource.NONE +}; + /** - * Directive for the (optional) leading or trailing icon of an mdcChip. - * Depenending on the position within the mdcChip the icon will determine + * Directive for the (optional) leading or trailing icon of an `mdcChip`. + * Depending on the position within the `mdcChip` the icon will determine * whether it is a leading or trailing icon. * Trailing icons must implement the functionality to remove the chip from the set, and - * must only be added to input chips (mdcChipSet="input"). Chips with a trailing - * icon must implement the remove event. + * must only be added to input chips (`mdcChipSet="input"`). Chips with a trailing + * icon must implement the `remove` event. Trailing icons should be wrapped + * inside an `mdcChipCell`. */ @Directive({ selector: '[mdcChipIcon]' }) export class MdcChipIconDirective { - @HostBinding('class.mdc-chip__icon') _cls = true; + /** @internal */ + @HostBinding('class.mdc-chip__icon') readonly _cls = true; + /** @internal */ @HostBinding('class.mdc-chip__icon--leading') _leading = false; /** - * Event emitted for trailing icon user interactions. + * Event emitted for trailing icon user interactions. Please note that chip removal should be + * handled by the `remove` output of the chip, *not* by a handler for this output. */ - @Output() interact: EventEmitter = new EventEmitter(); - private __trailing = false; - private _oldTabIndex: number; - private _oldRole: string; - - constructor(public _elm: ElementRef, private _rndr: Renderer2, public _cdRef: ChangeDetectorRef) {} - - @HostBinding('class.mdc-chip__icon--trailing') get _trailing() { - return this.__trailing; - } - - set _trailing(val: boolean) { - if (val !== this._trailing) { - this.__trailing = val; - if (this._trailing) { - this._oldTabIndex = this._elm.nativeElement.tabIndex; - this._elm.nativeElement.tabIndex = 0; - this._oldRole = this._elm.nativeElement.getAttribute('role'); - this._rndr.setAttribute(this._elm.nativeElement, 'role', 'button'); - } else { - if (this._oldTabIndex) { - this._elm.nativeElement.tabIndex = this._oldTabIndex; - if (this._oldRole) - this._rndr.setAttribute(this._elm.nativeElement, 'role', this._oldRole); - else - this._rndr.removeAttribute(this._elm.nativeElement, 'role'); - } - this._oldTabIndex = null; - this._oldRole = null; - } + @Output() readonly interact: EventEmitter = new EventEmitter(); + /** @internal */ + @HostBinding('class.mdc-chip__icon--trailing') _trailing = false; + private _originalTabindex: number | null = null; + private __tabindex: number = -1; + private __role: string | null = null; + /** @internal */ + _chip: MdcChipDirective | null = null; + + constructor(public _elm: ElementRef, private _rndr: Renderer2, public _cdRef: ChangeDetectorRef) { + this.__role = _elm.nativeElement.getAttribute('role'); + let tabIndex = _elm.nativeElement.getAttribute('tabindex'); + if (tabIndex) { + this._originalTabindex = +tabIndex; + this.__tabindex = +tabIndex; } } + + ngOnDestroy() { + this._chip = null; + } + + /** @internal */ + @HostBinding('attr.tabindex') get _tabindex() { + return this._trailing ? this.__tabindex : this._originalTabindex; + } + + /** @internal */ + set _tabindex(val: number | null) { + this.__tabindex = val == null ? -1 : val; + } + + /** @internal */ + @HostBinding('attr.role') get _role() { + if (this.__role) + return this.__role; + return this._trailing ? 'button' : null; + } + + /** @internal */ + @HostListener('click', ['$event']) _handleClick(event: MouseEvent) { + if (this._chip && this._trailing) + this._chip._foundation?.handleTrailingIconInteraction(event); + } + + /** @internal */ + @HostListener('keydown', ['$event']) _handleInteraction(event: KeyboardEvent) { + if (this._chip && this._trailing) + this._chip._foundation?.handleTrailingIconInteraction(event); + } } /** - * Directive for the text of an mdcChip. + * Directive for the text of an `mdcChip`. Must be contained in an `mdcChipPrimaryAction` + * directive. */ @Directive({ selector: '[mdcChipText]' }) export class MdcChipTextDirective { - @HostBinding('class.mdc-chip__text') _cls = true; + @HostBinding('class.mdc-chip__text') readonly _cls = true; constructor(public _elm: ElementRef) {} } /** - * Directive for a chip. Chips must be child elements of an mdcChipSet. + * Directive for the primary action element of a chip. The `mdcChipPrimaryAction` must + * contain the `mdcChipText` directive, and be contained by an `mdcChipCell` directive. + */ +@Directive({ + selector: '[mdcChipPrimaryAction]' +}) +export class MdcChipPrimaryActionDirective { + /** @internal */ + @HostBinding('class.mdc-chip__primary-action') readonly _cls = true; + private __tabindex: number = -1; + /** @internal */ + __role: string = 'button'; + + constructor(public _elm: ElementRef) { + this.__tabindex = +(this._elm.nativeElement.getAttribute('tabindex') || -1); + } + + /** @internal */ + @HostBinding('attr.role') get _role() { + return this.__role; + } + + /** @internal */ + @HostBinding('attr.tabindex') get _tabindex() { + return this.__tabindex; + } + + /** @internal */ + set _tabindex(val: number) { + this.__tabindex = val; + } +} + +/** + * Directive for the main content of a chip, or for an optional trailing + * action on `input` chips. This directive must contain an + * `mdcChipPrimaryActione` or an `mdcChipIcon` (when used for the trailing action). + * An `mdcChipCell` must always be the direct child of an `mdcChip`. + */ +@Directive({ + selector: '[mdcChipCell]' +}) +export class MdcChipCellDirective { + /** @internal */ + @HostBinding('attr.role') _role = 'gridcell'; + + constructor(public _elm: ElementRef) {} +} + +/** + * Directive for a chip. Chips must be child elements of an `mdcChipSet`, + * and must contain an `mdcChipCell`, and may additionally contain an `mdcChipIcon` for + * the leading icon. An optional trailing icon must be wrapped in a second `mdcChipCell`. */ @Directive({ selector: '[mdcChip]' }) export class MdcChipDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-chip') _cls = true; + /** @internal */ + static nextValue = 1; // for computing a unique value, if no value was provided + /** @internal */ + @HostBinding('class.mdc-chip') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role = 'row'; private initialized = false; private selectedMem = false; + private removableMem = true; + private _uniqueValue: string; + private _value: string | null = null; /** * Event emitted for user interaction with the chip. */ - @Output() interact: EventEmitter = new EventEmitter(); + @Output() readonly interact: EventEmitter = new EventEmitter(); /** * Event emitted when the user has removed (by clicking the trailing icon) the chip. - * This event must be implemented when the chip has a trailing icon, and the implementation - * must remove the chip from the set. Without such implementation the directive will - * animate the chip out of vision, but will not remove the chip from the DOM. + * This event must be implemented when the `removable` property is set, and the chip + * has a trailing icon. The implementation must remove the chip from the set. + * Without such implementation the directive will animate the chip out of vision, + * but will not remove the chip from the DOM. + */ + @Output() readonly remove: EventEmitter = new EventEmitter(); + /** + * Event emitted when a navigation event has occured. */ - @Output() remove: EventEmitter = new EventEmitter(); + @Output() readonly navigation: EventEmitter<{key: string, source: ChipEventSource}> = new EventEmitter(); /** * Event emitted when the chip changes from not-selected to selected state or vice versa * (for filter and choice chips). */ - @Output() selectedChange: EventEmitter = new EventEmitter(); - _set: MdcChipSetDirective; - private _checkmark: HTMLElement; - private _leadingIcon: MdcChipIconDirective; - private _trailingIcon: MdcChipIconDirective; - @ContentChildren(MdcChipIconDirective, {descendants: true}) _icons: QueryList; - @ContentChildren(MdcChipTextDirective, {descendants: true}) _texts: QueryList; - private _adapter: MdcChipAdapter = { + @Output() readonly selectedChange: EventEmitter = new EventEmitter(); + // Like selectedChange, but only the events that should go to the chipset (i.e. not including the ones initiated by the chipset) + /** @internal */ + @Output() readonly _selectedForChipSet: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly _notifyRemoval: EventEmitter<{removedAnnouncement: string | null}> = new EventEmitter(); + /** @internal */ + _set: MdcChipSetDirective | null = null; + private _checkmark: HTMLElement | null = null; + private _leadingIcon: MdcChipIconDirective | null = null; + private _trailingIcon: MdcChipIconDirective | null = null; + /** @internal */ + @ContentChildren(MdcChipIconDirective, {descendants: true}) _icons?: QueryList; + /** @internal */ + @ContentChildren(MdcChipTextDirective, {descendants: true}) _texts?: QueryList; + /** @internal */ + @ContentChildren(MdcChipPrimaryActionDirective, {descendants: true}) _primaryActions?: QueryList; + /** @internal */ + @ContentChildren(MdcChipCellDirective) _chipCells?: QueryList; + private _adapter: MDCChipAdapter = { addClass: (className: string) => { - let selectedChanged = className === 'mdc-chip--selected' && !this._elm.nativeElement.classList.contains(className); + const hasClass = this._elm.nativeElement.classList.contains(className); this._renderer.addClass(this._elm.nativeElement, className); - if (selectedChanged) + if (!hasClass && className === 'mdc-chip--selected') { + this.selectedMem = true; this.selectedChange.emit(true); + } }, removeClass: (className: string) => { - let selectedChanged = className === 'mdc-chip--selected' && this._elm.nativeElement.classList.contains(className); + const hasClass = this._elm.nativeElement.classList.contains(className); this._renderer.removeClass(this._elm.nativeElement, className); - if (selectedChanged) + if (hasClass && className === 'mdc-chip--selected') { + this.selectedMem = false; this.selectedChange.emit(false); + } }, hasClass: (className) => this._elm.nativeElement.classList.contains(className), - addClassToLeadingIcon: (className: string) => { - let icon = this._leadingIcon; - if (icon) - this._renderer.addClass(icon._elm.nativeElement, className); - }, - removeClassFromLeadingIcon: (className: string) => { - let icon = this._leadingIcon; - if (icon) - this._renderer.removeClass(icon._elm.nativeElement, className); - }, - eventTargetHasClass: (target: HTMLElement, className: string) => target.classList.contains(className), - registerEventHandler: (evt: string, handler: EventListener) => this._registry.listen(this._renderer, evt, handler, this._elm), - deregisterEventHandler: (evt: string, handler: EventListener) => this._registry.unlisten(evt, handler), - registerTrailingIconInteractionHandler: (evt: string, handler: EventListener) => { - let icon = this._trailingIcon; - if (icon) - this._registry.listen(this._renderer, evt, handler, icon._elm); - }, - deregisterTrailingIconInteractionHandler: (evt: string, handler: EventListener) => this._registry.unlisten(evt, handler), + addClassToLeadingIcon: (className: string) => this._leadingIcon && this._renderer.addClass(this._leadingIcon._elm.nativeElement, className), + removeClassFromLeadingIcon: (className: string) => this._leadingIcon && this._renderer.removeClass(this._leadingIcon._elm.nativeElement, className), + eventTargetHasClass: (target: HTMLElement, className: string) => !!target && target.classList.contains(className), + getAttribute: (attr: string) => this._elm.nativeElement.getAttribute(attr), notifyInteraction: () => this.interact.emit(), - notifyTrailingIconInteraction: () => this._trailingIcon.interact.emit(), - notifyRemoval: () => this.remove.emit(), + notifySelection: (selected: boolean, chipSetShouldIgnore: boolean) => { + if (!chipSetShouldIgnore) + this._selectedForChipSet.emit(selected); + }, + notifyTrailingIconInteraction: () => this._trailingIcon!.interact.emit(), + notifyRemoval: (removedAnnouncement: string | null) => this._notifyRemoval.emit({removedAnnouncement}), + notifyNavigation: (key: string, source: EventSource) => this.navigation.emit({key, source: source}), getComputedStyleValue: (propertyName: string) => getComputedStyle(this._elm.nativeElement).getPropertyValue(propertyName), - setStyleProperty: (style: string, value: string) => this._renderer.setStyle(this._elm.nativeElement, style, value) + setStyleProperty: (style: string, value: string) => this._renderer.setStyle(this._elm.nativeElement, style, value), + hasLeadingIcon: () => !!this._leadingIcon, + getRootBoundingClientRect: () => this._elm.nativeElement.getBoundingClientRect(), + getCheckmarkBoundingClientRect: () => this._checkmark?.getBoundingClientRect() || null, + setPrimaryActionAttr: (attr: string, value: string) => this._primaryAction && this._renderer.setAttribute(this._primaryAction._elm.nativeElement, attr, value), + focusPrimaryAction: () => this._primaryAction?._elm.nativeElement.focus(), + hasTrailingAction: () => !!this._trailingIcon, + setTrailingActionAttr: (attr: string, value: string) => this._trailingIcon && this._renderer.setAttribute(this._trailingIcon._elm.nativeElement, attr, value), + focusTrailingAction: () => this._trailingIcon?._elm.nativeElement.focus(), + isRTL: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl' }; - _foundation: { - init: Function, - destroy: Function, - isSelected: () => boolean, - setSelected: (selected: boolean) => void - } = new MDCChipFoundation(this._adapter); + /** @internal */ + _foundation: MDCChipFoundation = new MDCChipFoundation(this._adapter); - constructor(private _elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry) { - super(_elm, rndr, registry); + constructor(private _elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, rndr, registry, doc as Document); + this._uniqueValue = `mdc-chip-${MdcChipDirective.nextValue++}`; } ngAfterContentInit() { - if (!this._elm.nativeElement.hasAttribute('tabindex')) - // unless overridden, make the chip tabbable: - this._elm.nativeElement.tabIndex = 0; + this.initActions(); this.initIcons(); - this._icons.changes.subscribe(() => { - this._reInit(); - }); - this._texts.changes.subscribe(() => { - this._reInit(); - }); - this.initRipple(); + this._icons!.changes.subscribe(() => this._reInit()); + this._texts!.changes.subscribe(() => this._reInit()); + this._primaryActions!.changes.subscribe(() => this._reInit()); + this._chipCells!.changes.subscribe(() => this._reInit()); + this.addRippleSurface('mdc-chip__ripple'); this.initCheckMark(); + this.initRipple(); this._foundation.init(); if (this.selectedMem) // triggers setting the foundation selected state (and possibly for other [choice] chips too): this.selected = this.selectedMem; + if (!this.removableMem) + this._foundation.setShouldRemoveOnTrailingIconClick(this.removableMem); this.initialized = true; } @@ -178,26 +284,44 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI this._foundation.destroy(); } + /** @internal */ _reInit() { // if icons have changed, the foundation must be reinitialized, because // trailingIconInteractionHandler might have to be removed and/or attached // to another icon: this._foundation.destroy(); this._foundation = new MDCChipFoundation(this._adapter); + this.initActions(); this.initIcons(); this.initCheckMark(); this._foundation.init(); + if (!this.removableMem) + this._foundation.setShouldRemoveOnTrailingIconClick(this.removableMem); // no need to call setSelected again, as the previous state will still be available via // the mdc-chip--selected class } + private initActions() { + if (this._set) { + let role = 'button'; + if (this._set._type === 'choice') + role = 'radio'; + else if (this._set._type === 'filter') + role = 'checkbox'; + this._primaryActions!.forEach(action => { + action.__role = role; + }); + } + } + private initIcons() { let newLeading = this.computeLeadingIcon(); let newTrailing = this.computeTrailingIcon(newLeading); if (newLeading !== this._leadingIcon || newTrailing !== this._trailingIcon) { this._leadingIcon = newLeading; this._trailingIcon = newTrailing; - this._icons.forEach(icon => { + this._icons!.forEach(icon => { + icon._chip = this; let leading = icon === this._leadingIcon; let trailing = icon === this._trailingIcon; let changed = leading !== icon._leading || trailing !== icon._trailing; @@ -210,8 +334,20 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI } } + private get _text() { + return this._texts?.first; + } + + private get _primaryAction() { + return this._primaryActions?.first; + } + + private get _chipCell() { + return this._chipCells?.first; + } + private computeLeadingIcon() { - if (this._icons.length > 0) { + if (this._icons && this._icons.length > 0) { let icon = this._icons.first; let prev = this.previousElement(icon._elm.nativeElement); let last = icon._elm.nativeElement; @@ -232,13 +368,9 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI return null; } - private get _text() { - return this._texts.first; - } - - private computeTrailingIcon(leading: MdcChipIconDirective) { - if (this._icons.length > 0) { - let icon = this._icons.last; + private computeTrailingIcon(leading: MdcChipIconDirective | null) { + if (this._icons!.length > 0) { + let icon = this._icons!.last; if (icon === leading) return null; // if not the leading icon, it must be the trailing icon: @@ -262,7 +394,7 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI } private addCheckMark() { - if (!this._checkmark) { + if (!this._checkmark && this._chipCell) { let path = this._renderer.createElement('path', 'svg'); this._renderer.addClass(path, 'mdc-chip__checkmark-path'); this._renderer.setAttribute(path, 'fill', 'none'); @@ -275,54 +407,114 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI this._checkmark = this._renderer.createElement('div'); this._renderer.appendChild(this._checkmark, svg); this._renderer.addClass(this._checkmark, 'mdc-chip__checkmark'); - let beforeElement = this._text ? this._text._elm.nativeElement : null; - if (beforeElement) - // checkmark should go after leading icon: - this._renderer.insertBefore(this._elm.nativeElement, this._checkmark, beforeElement); - else - this._renderer.appendChild(this._elm.nativeElement, this._checkmark); + this._renderer.insertBefore(this._elm.nativeElement, this._checkmark, this._chipCell._elm.nativeElement); } } private removeCheckMark() { if (this._checkmark) { - this._checkmark.parentElement.removeChild(this._checkmark); + this._checkmark.parentElement!.removeChild(this._checkmark); this._checkmark = null; } } + /** + * The value the chip represents. The value must be unique for the `mdcChipSet`. If you do not provide a value + * a unique value will be computed automatically. + */ + @Input() get value(): string { + return this._value ? this._value : this._uniqueValue; + } + + set value(val: string) { + this._value = val; + } + /** * The 'selected' state of the chip. Filter and choice chips are either selected or * not selected. Making a choice chip selected, will make all other chips in that set * not selected. */ - @Input() get selected(): any { + @Input() get selected(): boolean { return this.initialized ? this._foundation.isSelected() : this.selectedMem; } - set selected(val: any) { + set selected(val: boolean) { let value = asBoolean(val); this.selectedMem = value; - if (this.initialized && value !== this._foundation.isSelected()) { - if (value && this._set) - // this will also trigger deselection of other values for choice chips - this._set._foundation.select(this._foundation); - else - this._foundation.setSelected(val); - } + if (this.initialized && value !== this._foundation.isSelected()) + this._foundation.setSelected(value); // when not initialized the selectedChange will be emitted via the foundation after // initialization } + static ngAcceptInputType_selected: boolean | ''; + + /** + * If set to a value other than `false`, clicking the trailing icon will animate the + * chip out of view, and then emit the `remove` output. + */ + @HostBinding('class.mdc-chip--deletable') + @Input() get removable(): boolean { + return this.initialized ? this._foundation.getShouldRemoveOnTrailingIconClick() : this.removableMem; + } + + set removable(val: boolean) { + let value = asBoolean(val); + this.removableMem = value; + if (this.initialized && value !== this._foundation.getShouldRemoveOnTrailingIconClick()) + this._foundation.setShouldRemoveOnTrailingIconClick(value); + // when not initialized the removable change will be set on the foundation after + // initialization + } + + static ngAcceptInputType_removable: boolean | ''; + /** @docs-private */ protected computeRippleBoundingRect() { - if (this._checkmark && !this._leadingIcon) { - const height = this._rippleElm.nativeElement.getBoundingClientRect().height; - // https://github.com/material-components/material-components-web/blob/cb373ad34857070734a7c02bf59116e21853842a/packages/mdc-chips/chip/index.js#L60: - // the checkmark should be square, but initiallly the width is set to 0 - return { height: height, width: height }; - } - return super.computeRippleBoundingRect(); + return this._foundation.getDimensions(); + } + + /** @internal */ + @HostListener('click', ['$event']) _handleInteraction(event: MouseEvent) { + this._foundation?.handleInteraction(event); + } + + /** @internal */ + @HostListener('transitionend', ['$event']) _handleTransitionEnd(event: TransitionEvent) { + this._foundation?.handleTransitionEnd(event); + } + + /** @internal */ + @HostListener('keydown', ['$event']) _handleKeydown(event: KeyboardEvent) { + this._foundation?.handleKeydown(event); + this._foundation?.handleInteraction(event); + } + + /** @internal */ + _untabbable() { + if (this._primaryAction) + this._primaryAction._tabindex = -1; + if (this._trailingIcon) + this._trailingIcon._tabindex = -1; + } + + /** @internal */ + _allowtabbable() { + let result = !!this._primaryAction && this._primaryAction._tabindex !== -1; + if (result && this._trailingIcon) + this._trailingIcon._tabindex = -1; + if (!result) + result = !!this._trailingIcon && this._trailingIcon._tabindex != null && this._trailingIcon._tabindex !== -1; + return result; + } + + /** @internal */ + _forceTabbable() { + if (this._primaryAction) + this._primaryAction._tabindex = 0; + else if (this._trailingIcon) + this._trailingIcon._tabindex = 0; } } @@ -333,54 +525,57 @@ export class MdcChipDirective extends AbstractMdcRipple implements AfterContentI selector: '[mdcChipSet]' }) export class MdcChipSetDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-chip-set') _cls = true; - @ContentChildren(MdcChipDirective, {descendants: true}) _chips: QueryList; - private _interactSubscriptions: Subscription[]; - private _removeSubscriptions: Subscription[]; + /** @internal */ + @HostBinding('class.mdc-chip-set') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role = 'grid'; + /** @internal */ + @ContentChildren(MdcChipDirective, {descendants: true}) _chips?: QueryList; + private _subscriptions: Subscription[] = []; private _initialized = false; - private _interactionHandler: EventListener; + /** @internal */ _type: 'choice' | 'filter' | 'input' | 'action' = 'action'; - _adapter: MdcChipSetAdapter = { + /** @internal */ + _adapter: MDCChipSetAdapter = { hasClass: (className: string) => this._elm.nativeElement.classList.contains(className), - registerInteractionHandler: (evt: string, handler: EventListener) => { - if (evt === 'MDCChip:interaction') - this._interactionHandler = handler; - // 'MDCChip:removal' is not really used, we call deselect/removeChip directly on the angular eventemitter subscription - else - this._registry.listen(this._rndr, evt, handler, this._elm); + removeChipAtIndex: (index: number) => { + this.chip(index)!.remove.emit(); + // needed so that when focusChipTrailingActionAtIndex is called the + // chip has already been removed from the DOM: + this.cdRef.detectChanges(); }, - deregisterInteractionHandler: (evt: string, handler: EventListener) => { - if (evt === 'MDCChip:interaction') - this._interactionHandler = null; - else - this._registry.unlisten(evt, handler); + selectChipAtIndex: (index: number, selected: boolean, shouldNotifyClients: boolean) => { + this.chip(index)?._foundation.setSelectedFromChipSet(selected, shouldNotifyClients); }, - removeChip: (chip: any) => { - throw new Error('this adapter method should be unreachable in the MdcChipSetDirective implementation'); - } + getIndexOfChipById: (chipValue) => this.findChipIndex(chipValue), + focusChipPrimaryActionAtIndex: (index) => this.chip(index)?._foundation.focusPrimaryAction(), + focusChipTrailingActionAtIndex: (index) => this.chip(index)?._foundation.focusTrailingAction(), + removeFocusFromChipAtIndex: (index) => this.chip(index)?._foundation.removeFocus(), + isRTL: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', + getChipListCount: () => this._chips!.length, + announceMessage: (message: string) => announce(message) }; - _foundation: { - init: Function, - destroy: Function, - select: (chip: MDCChipFoundation) => void, - deselect: (chip: MDCChipFoundation) => void - } = new MDCChipSetFoundation(this._adapter); + /** @internal */ + _foundation: MDCChipSetFoundation | null = new MDCChipSetFoundation(this._adapter); - constructor(private _elm: ElementRef, private _rndr: Renderer2, private _registry: MdcEventRegistry) {} + constructor(private _elm: ElementRef, private cdRef: ChangeDetectorRef) {} ngAfterContentInit() { - this._chips.changes.subscribe(() => { + this._chips!.changes.subscribe(() => { this.initSubscriptions(); this.initChips(); + this.cdRef.detectChanges(); }); this.initSubscriptions(); this.initChips(); - this._foundation.init(); + this._foundation!.init(); this._initialized = true; + this.cdRef.detectChanges(); } ngOnDestroy() { - this._foundation.destroy(); + this._foundation?.destroy(); + this._foundation = null; this.destroySubscriptions(); this._initialized = false; } @@ -394,7 +589,7 @@ export class MdcChipSetDirective implements AfterContentInit, OnDestroy { return this._type; } - set mdcChipSet(value: any) { + set mdcChipSet(value: 'choice' | 'filter' | 'input' | 'action') { if (value !== this._type) { if (value === 'choice' || value === 'filter' || value ==='input') this._type = value; @@ -405,60 +600,77 @@ export class MdcChipSetDirective implements AfterContentInit, OnDestroy { } } + static ngAcceptInputType_mdcChipSet: 'choice' | 'filter' | 'input' | 'action' | ''; + private initChips(force = false) { - this._chips.forEach(chip => { + let hasTabbableItem = false; + this._chips!.forEach(chip => { if (force || chip._set !== this) { chip._set = this; chip._reInit(); } + if (hasTabbableItem) + chip._untabbable(); + else + hasTabbableItem = chip._allowtabbable(); }); + if (!hasTabbableItem && this._chips!.length > 0) + this._chips!.first!._forceTabbable(); } private destroySubscriptions() { try { - if (this._interactSubscriptions) - this._interactSubscriptions.forEach(sub => sub.unsubscribe()); - if (this._removeSubscriptions) - this._removeSubscriptions.forEach(sub => sub.unsubscribe()); + this._subscriptions.forEach(sub => sub.unsubscribe()); } finally { - this._interactSubscriptions = null; - this._removeSubscriptions = null; + this._subscriptions = []; } } private initSubscriptions() { this.destroySubscriptions(); - this._interactSubscriptions = []; - this._removeSubscriptions = []; - this._chips.forEach(chip => { - this._interactSubscriptions.push(chip.interact.subscribe(event => { - // using the interactionHandler that was registered by the foundation: - if (this._interactionHandler) - this._interactionHandler({ - detail: { chip: { foundation: chip._foundation }} - }); - })); - this._removeSubscriptions.push(chip.remove.subscribe(event => { - // directly handling, bypassing event handlers: - this._foundation.deselect(chip._foundation); - // don't call this._adapter.removeChip(chip); - })); + this._subscriptions = []; + this._chips!.forEach(chip => { + this._subscriptions!.push(chip.interact.subscribe(() => this._foundation!.handleChipInteraction({chipId: chip.value}))); + this._subscriptions!.push(chip._selectedForChipSet.subscribe((selected: boolean) => + this._foundation!.handleChipSelection({chipId: chip.value, selected, shouldIgnore: false}))); + this._subscriptions!.push(chip._notifyRemoval.subscribe(({removedAnnouncement}: {removedAnnouncement: string | null}) => + this._foundation!.handleChipRemoval({chipId: chip.value, removedAnnouncement}))); + this._subscriptions!.push(chip.navigation.subscribe(({key, source}: {key: string, source: EventSource}) => + this._foundation!.handleChipNavigation({chipId: chip.value, key, source}))); }); } + private chip(index: number) { + if (index < 0 || index >= this._chips!.length) + return null; + return this._chips!.toArray()[index]; + } + + private findChipIndex(chipValue: any): number { + return this._chips!.toArray().findIndex(chip => chip.value === chipValue); + } + + /** @internal */ @HostBinding('class.mdc-chip-set--choice') get _choice() { return this._type === 'choice'; } + /** @internal */ @HostBinding('class.mdc-chip-set--filter') get _filter() { return this._type === 'filter'; } + /** @internal */ @HostBinding('class.mdc-chip-set--input') get _input() { return this._type === 'input'; } } export const CHIP_DIRECTIVES = [ - MdcChipIconDirective, MdcChipTextDirective, MdcChipDirective, MdcChipSetDirective + MdcChipIconDirective, + MdcChipTextDirective, + MdcChipPrimaryActionDirective, + MdcChipCellDirective, + MdcChipDirective, + MdcChipSetDirective ]; diff --git a/bundle/src/components/dialog/mdc.dialog.adapter.ts b/bundle/src/components/dialog/mdc.dialog.adapter.ts deleted file mode 100644 index 5f98be8..0000000 --- a/bundle/src/components/dialog/mdc.dialog.adapter.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** @docs-private */ -export interface MdcDialogAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - addBodyClass: (className: string) => void, - removeBodyClass: (className: string) => void, - eventTargetHasClass: (target: EventTarget, className: string) => boolean, - registerInteractionHandler: (evt: string, handler: EventListener) => void, - deregisterInteractionHandler: (evt: string, handler: EventListener) => void, - registerSurfaceInteractionHandler: (evt: string, handler: EventListener) => void, - deregisterSurfaceInteractionHandler: (evt: string, handler: EventListener) => void, - registerDocumentKeydownHandler: (handler: EventListener) => void, - deregisterDocumentKeydownHandler: (handler: EventListener) => void, - registerTransitionEndHandler: (handler: EventListener) => void, - deregisterTransitionEndHandler: (handler: EventListener) => void, - notifyAccept: () => void, - notifyCancel: () => void, - trapFocusOnSurface: () => void, - untrapFocusOnSurface: () => void, - isDialog: (el: Element) => boolean -} diff --git a/bundle/src/components/dialog/mdc.dialog.directive.spec.ts b/bundle/src/components/dialog/mdc.dialog.directive.spec.ts index c1546b4..1f333ae 100644 --- a/bundle/src/components/dialog/mdc.dialog.directive.spec.ts +++ b/bundle/src/components/dialog/mdc.dialog.directive.spec.ts @@ -1,30 +1,35 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Component } from '@angular/core'; +import { numbers } from '@material/dialog'; import { FOCUS_TRAP_DIRECTIVES } from '../focus-trap/mdc.focus-trap.directive'; -import { DIALOG_DIRECTIVES, MdcDialogDirective, MdcDialogBodyDirective } from './mdc.dialog.directive'; -import { MdcButtonDirective } from '../button/mdc.button.directive'; -import { cancelledClick, booleanAttributeStyleTest } from '../../testutils/page.test'; +import { DIALOG_DIRECTIVES, MdcDialogDirective } from './mdc.dialog.directive'; +import { BUTTON_DIRECTIVES } from '../button/mdc.button.directive'; const templateWithDialog = ` - +
+
`; +const tickTime = Math.max(numbers.DIALOG_ANIMATION_CLOSE_TIME_MS, numbers.DIALOG_ANIMATION_OPEN_TIME_MS); + describe('MdcDialogDirective', () => { @Component({ template: templateWithDialog @@ -37,105 +42,206 @@ describe('MdcDialogDirective', () => { function setup() { const fixture = TestBed.configureTestingModule({ - declarations: [...DIALOG_DIRECTIVES, ...FOCUS_TRAP_DIRECTIVES, MdcButtonDirective, TestComponent] + declarations: [...DIALOG_DIRECTIVES, ...FOCUS_TRAP_DIRECTIVES, ...BUTTON_DIRECTIVES, TestComponent] }).createComponent(TestComponent); fixture.detectChanges(); return { fixture }; } - it('should only display the dialog when opened', (() => { + it('accessibility and structure', fakeAsync(() => { + const { fixture } = setup(); + validateDom(fixture.nativeElement.querySelector('#dialog')); + })); + + it('should only display the dialog when opened', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); const dialog = fixture.nativeElement.querySelector('#dialog'); + const mdcDialog = fixture.debugElement.query(By.directive(MdcDialogDirective)).injector.get(MdcDialogDirective); const cancel = fixture.nativeElement.querySelector('#cancel'); const accept = fixture.nativeElement.querySelector('#accept'); + // open/close by button: + expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); + button.click(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); + cancel.click(); tick(tickTime); flush(); expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); - button.click(); + button.click(); tick(tickTime); flush(); expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); - cancel.click(); + accept.click(); tick(tickTime); flush(); expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); - button.click(); + + // open/close with function calls: + mdcDialog.open(); tick(tickTime); flush(); expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); - accept.click(); + mdcDialog.close('accept'); tick(tickTime); flush(); expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); })); - it('should trap focus to the dialog when opened', (() => { + it('should trap focus to the dialog when opened', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); const dialog = fixture.nativeElement.querySelector('#dialog'); const accept = fixture.nativeElement.querySelector('#accept'); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); - button.click(); - // focusTrap is activated on animation 'transitionend', so simulate that event - // (as tick() and friends won't wait for it): - fixture.nativeElement.querySelector('#surface').dispatchEvent(new TransitionEvent('transitionend', {})); - // clicks on the button should now be cancelled: - expect(cancelledClick(button)).toBe(true); - // clicks on buttons inside the dialog should not be cancelled: - expect(cancelledClick(accept)).toBe(false); + // no sentinels means no focus trapping: + expect([...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')].length).toBe(0); + + button.click(); tick(tickTime); flush(); + // should now have focus trap sentinels: + expect([...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')].length).toBe(2); + + accept.click(); tick(tickTime); flush(); + // focus trap should be cleaned up: + expect([...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')].length).toBe(0); })); - it('should apply dialog button styling to buttons dynamically added', (() => { + it('should initially focus mdcDialogDefault', fakeAsync(() => { + const { fixture } = setup(); + const button = fixture.nativeElement.querySelector('#open'); + const accept = fixture.nativeElement.querySelector('#accept'); + + button.click(); tick(tickTime); flush(); + expect(document.activeElement).toBe(accept); + })); + + it('should apply dialog button styling to buttons dynamically added', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); - const dialog = fixture.nativeElement.querySelector('#dialog'); const testComponent = fixture.debugElement.injector.get(TestComponent); testComponent.cancelButton = false; testComponent.acceptButton = false; fixture.detectChanges(); - button.click(); + button.click(); tick(tickTime); flush(); expect(fixture.nativeElement.querySelector('#cancel')).toBeNull(); testComponent.cancelButton = true; testComponent.acceptButton = true; fixture.detectChanges(); const cancel = fixture.nativeElement.querySelector('#cancel'); - expect(cancel.classList).toContain('mdc-dialog__footer__button'); + expect(cancel.classList).toContain('mdc-dialog__button'); const accept = fixture.nativeElement.querySelector('#accept'); - expect(accept.classList).toContain('mdc-dialog__footer__button'); - expect(accept.classList).toContain('mdc-dialog__footer__button--accept'); + expect(accept.classList).toContain('mdc-dialog__button'); + expect(cancel.classList).toContain('mdc-dialog__button'); })); - it('should emit the accept event', (() => { + it('should emit the accept event', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); const mdcDialog = fixture.debugElement.query(By.directive(MdcDialogDirective)).injector.get(MdcDialogDirective); const accept = fixture.nativeElement.querySelector('#accept'); - button.click(); + button.click(); tick(tickTime); flush(); let accepted = false; mdcDialog.accept.subscribe(() => { accepted = true; }); - accept.click(); + accept.click(); tick(tickTime); flush(); expect(accepted).toBe(true); })); - it('should emit the cancel event', (() => { + it('should emit the cancel event', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); const mdcDialog = fixture.debugElement.query(By.directive(MdcDialogDirective)).injector.get(MdcDialogDirective); const cancel = fixture.nativeElement.querySelector('#cancel'); - button.click(); + button.click(); tick(tickTime); flush(); let canceled = false; mdcDialog.cancel.subscribe(() => { canceled = true; }); - cancel.click(); + cancel.click(); tick(tickTime); flush(); expect(canceled).toBe(true); })); - it('should style the body according to the scrollable property', (() => { + it('should style the body according to the scrollable property', fakeAsync(() => { const { fixture } = setup(); const button = fixture.nativeElement.querySelector('#open'); const dialog = fixture.nativeElement.querySelector('#dialog'); const testComponent = fixture.debugElement.injector.get(TestComponent); - const mdcDialogBody = fixture.debugElement.query(By.directive(MdcDialogBodyDirective)).injector.get(MdcDialogBodyDirective); - - button.click(); - booleanAttributeStyleTest( - fixture, - testComponent, - mdcDialogBody, - 'scrollable', - 'scrollable', - 'mdc-dialog__body--scrollable'); + + testComponent.scrollable = true; + fixture.detectChanges(); + button.click(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--scrollable')).toBe(true, 'dialog content must be scrollable'); + })); + + it('button without mdcDialogTrigger should not close the dialog', fakeAsync(() => { + const { fixture } = setup(); + const button = fixture.nativeElement.querySelector('#open'); + const dialog = fixture.nativeElement.querySelector('#dialog'); + const noTrigger = fixture.nativeElement.querySelector('#noTrigger'); + + button.click(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); + noTrigger.click(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); })); + + it('enter should trigger mdcDialogDefault', fakeAsync(() => { + const { fixture } = setup(); + const button = fixture.nativeElement.querySelector('#open'); + const dialog = fixture.nativeElement.querySelector('#dialog'); + const mdcDialog = fixture.debugElement.query(By.directive(MdcDialogDirective)).injector.get(MdcDialogDirective); + const input = fixture.nativeElement.querySelector('#someInput'); + let accepted = false; + mdcDialog.accept.subscribe(() => { accepted = true; }); + + button.click(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); + input.focus(); + expect(document.activeElement).toBe(input); + input.dispatchEvent(newKeydownEvent('Enter')); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); + expect(accepted).toBe(true); + })); + + it('escape should trigger cancel', fakeAsync(() => { + const { fixture } = setup(); + const dialog = fixture.nativeElement.querySelector('#dialog'); + const mdcDialog = fixture.debugElement.query(By.directive(MdcDialogDirective)).injector.get(MdcDialogDirective); + let canceled = false; + mdcDialog.cancel.subscribe(() => { canceled = true; }); + + mdcDialog.open(); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(true, 'dialog must be in opened state'); + document.body.dispatchEvent(newKeydownEvent('Escape')); tick(tickTime); flush(); + expect(dialog.classList.contains('mdc-dialog--open')).toBe(false, 'dialog must be in closed state'); + expect(canceled).toBe(true); + })); + + function validateDom(dialog) { + expect(dialog.classList).toContain('mdc-dialog'); + expect(dialog.children.length).toBe(2); + const container = dialog.children[0]; + const scrim = dialog.children[1]; + expect(container.classList).toContain('mdc-dialog__container'); + expect(container.children.length).toBe(1); + const surface = container.children[0]; + expect(surface.classList).toContain('mdc-dialog__surface'); + expect(surface.getAttribute('role')).toBe('alertdialog'); + expect(surface.getAttribute('aria-modal')).toBe('true'); + const labelledBy = surface.getAttribute('aria-labelledby'); + expect(labelledBy).toMatch(/[a-zA-Z0-9_-]+/); + const describedBy = surface.getAttribute('aria-describedby'); + expect(describedBy).toMatch(/[a-zA-Z0-9_-]+/); + expect(surface.children.length).toBe(3); + const title = surface.children[0]; + const content = surface.children[1]; + const footer: Element = surface.children[2]; + expect(title.classList).toContain('mdc-dialog__title'); + expect(title.id).toBe(labelledBy); + expect(content.classList).toContain('mdc-dialog__content'); + expect(content.id).toBe(describedBy); + expect(footer.classList).toContain('mdc-dialog__actions'); + const buttons = [].slice.call(footer.children); + for (let button of buttons) { + expect(button.classList).toContain('mdc-button'); + expect(button.classList).toContain('mdc-dialog__button'); + } + expect(scrim.classList).toContain('mdc-dialog__scrim'); + } + + function newKeydownEvent(key: string) { + let event = new KeyboardEvent('keydown', {key}); + event.initEvent('keydown', true, true); + return event; + } }); diff --git a/bundle/src/components/dialog/mdc.dialog.directive.ts b/bundle/src/components/dialog/mdc.dialog.directive.ts index ba0c2e4..d880215 100644 --- a/bundle/src/components/dialog/mdc.dialog.directive.ts +++ b/bundle/src/components/dialog/mdc.dialog.directive.ts @@ -1,167 +1,206 @@ import { AfterContentInit, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, - OnDestroy, Optional, Output, QueryList, Renderer2, Self, forwardRef } from '@angular/core'; -import { MDCDialogFoundation } from '@material/dialog'; + OnDestroy, OnInit, Optional, Output, QueryList, Renderer2, Self, Inject, HostListener, forwardRef } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { MDCDialogFoundation, MDCDialogAdapter, util, cssClasses } from '@material/dialog'; +import { ponyfill } from '@material/dom' import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -import { asBoolean } from '../../utils/value.utils'; import { MdcButtonDirective } from '../button/mdc.button.directive'; import { AbstractMdcFocusInitial, AbstractMdcFocusTrap, FocusTrapHandle } from '../focus-trap/abstract.mdc.focus-trap'; -import { MdcDialogAdapter } from './mdc.dialog.adapter'; - -// Note: class mdc-dialog__action not used, since it currently doesn't do anything in MCW anyway: -// the CSS-rules for this in dialog.scss have lower specifity than those of mdc_button itself, -// so the secondary color never gets applied. +import { HasId } from '../abstract/mixin.mdc.hasid'; +import { applyMixins } from '../../utils/mixins'; +@Directive() +class MdcDialogTitleDirectiveBase {} +interface MdcDialogTitleDirectiveBase extends HasId {} +applyMixins(MdcDialogTitleDirectiveBase, [HasId]); /** - * Directive for the title of a dialog (mdcDialog). - * This should be used for the child of an element with the mdcDialogHeader - * directive. + * Directive for the title of an `mdcDialog`. + * A title is optional. If used, it should be the first child of an `mdcDialogSurface`. + * Please note that there should be no whitespace separating the start/end tag and the title + * itself. (The easiest way to achieve this is to *not* set the `preserveWhitespaces` option to + * `true` the `angularCompilerOptions`). */ @Directive({ - selector: '[mdcDialogHeaderTitle]' + selector: '[mdcDialogTitle]' }) -export class MdcDialogHeaderTitleDirective { - @HostBinding('class.mdc-dialog__header__title') _cls = true; -} +export class MdcDialogTitleDirective extends MdcDialogTitleDirectiveBase implements OnInit { + /** @internal */ + @HostBinding('class.mdc-dialog__title') readonly _cls = true; -/** - * Directive for the header of a dialog (mdcDialog). - * This should be used on the first child element of an mdcDialogSurface - * directive. Add the title of the dialog in a child element with the - * mdcDialogHeaderTitle directive. - */ -@Directive({ - selector: '[mdcDialogHeader]' -}) -export class MdcDialogHeaderDirective { - @HostBinding('class.mdc-dialog__header') _cls = true; + ngOnInit() { + this.initId(); + } } +@Directive() +class MdcDialogContentDirectiveBase {} +interface MdcDialogContentDirectiveBase extends HasId {} +applyMixins(MdcDialogContentDirectiveBase, [HasId]); /** - * Directive for the body part of a dialog (mdcDialog). - * This should be added to a child element of an mdcDialogSurface - * directive. + * Directive for the content part of an `mdcDialog`. + * This should be added as a child element of an `mdcDialogSurface`. */ @Directive({ - selector: '[mdcDialogBody]' + selector: '[mdcDialogContent]' }) -export class MdcDialogBodyDirective { - @HostBinding('class.mdc-dialog__body') _cls = true; - private _scrollable = false; +export class MdcDialogContentDirective extends MdcDialogContentDirectiveBase implements OnInit { + /** @internal */ + @HostBinding('class.mdc-dialog__content') readonly _cls = true; constructor(public _elm: ElementRef) { + super(); } - /** - * Set this property to true for dialog content that won't be able to fit the screen - * without scrolling. It will give the body a max-height, and thus (when necessary) will - * make the content scrollable. - * The max-height value that is applied can be overridden via the - * .mdc-dialog__body--scrollable selector in CSS. - */ - @HostBinding('class.mdc-dialog__body--scrollable') @Input() - get scrollable() { - return this._scrollable; - } - - set scrollable(val: any) { - this._scrollable = asBoolean(val); + ngOnInit() { + this.initId(); } } /** - * Directive for footer of a dialog (mdcDialog). - * This should be added to a child element of an mdcDialogSurface - * directive. - * The footer typically contains buttons, for which the mdcButton - * directive should be used. Cancel and accept buttons should also be marked - * with an mdcDialogCancel or mdcDialogAccept + * Directive for the actions (footer) of an `mdcDialog`. + * This is an (optional) last child of the `mdcDialogSurface` directive. + * This directive should contain buttons, for that should use the `mdcButton` * directive. + * + * Action buttons should typically close the dialog, and should therefore + * also set a value for the `mdcDialogTrigger` directive. */ @Directive({ - selector: '[mdcDialogFooter]', + selector: '[mdcDialogActions]', }) -export class MdcDialogFooterDirective implements AfterContentInit { - @HostBinding('class.mdc-dialog__footer') _cls = true; - @ContentChildren(MdcButtonDirective, {descendants: true}) _buttons: QueryList; +export class MdcDialogActionsDirective implements AfterContentInit { + /** @internal */ + @HostBinding('class.mdc-dialog__actions') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcButtonDirective, {descendants: true}) _buttons?: QueryList; constructor(private _rndr: Renderer2) { } ngAfterContentInit() { this.initButtons(); - this._buttons.changes.subscribe(() => { + this._buttons!.changes.subscribe(() => { this.initButtons(); }); } private initButtons() { - this._buttons.forEach(btn => { - this._rndr.addClass(btn._elm.nativeElement, 'mdc-dialog__footer__button'); + this._buttons!.forEach(btn => { + this._rndr.addClass(btn._elm.nativeElement, 'mdc-dialog__button'); }); } } /** - * Directive to mark the accept button of a mdcDialog. This directive should - * be used in combination with the mdcButton directive. Accept button presses - * trigger the accept event on the dialog. + * Any element within a dialog may include this directive (and assigne a non empty value to it) + * to indicate that interacting with it should close the dialog with the specified action. + * + * This action is then reflected via the `action` field in the `closing` and `closed` events of + * the dialog. A value of `close` will also trigger the `cancel` event of the dialog, and a value of + * `accept` will trigger the `accept` event. * - * When the dialog is marked with the mdcFocusTrap directive, the focus trap will - * focus this button when activated. If you want to focus another element in the dialog - * instead, add the mdcFocusInitial directive to that element. + * Any action buttons within the dialog that equate to a dismissal with no further action should + * use set `mdcDialogTrigger="close"`. This will make it easy to handle all such interactions consistently + * (via either the `cancel`, `closing`, or `closed` events), while separately handling other actions. */ @Directive({ - selector: '[mdcDialogAccept]', - providers: [{provide: AbstractMdcFocusInitial, useExisting: forwardRef(() => MdcDialogAcceptDirective) }] + selector: '[mdcDialogTrigger]' }) -export class MdcDialogAcceptDirective extends AbstractMdcFocusInitial { - /** @docs-private */ readonly priority = 1; - @HostBinding('class.mdc-dialog__footer__button--accept') _cls = true; - +export class MdcDialogTriggerDirective { constructor(public _elm: ElementRef) { - super(); } + + /** + * Set the `action` value that should be send to `closing` and `closed` events when a user + * interacts with this element. (When set to an empty string the button/element will not be wired + * to close the dialog). + */ + @Input() mdcDialogTrigger: string | null = null; } /** - * Directive to mark the cancel button of a mdcDialog. This directive should - * be used in combination with the mdcButton directive. Cancel button presses - * trigger the cancel event on the dialog. + * This directive can be used to mark one of the dialogs action buttons as the default action. + * This action will then be triggered by pressing the enter key while the dialog has focus. + * The default action also will receive focus when the dialog is opened. Unless another + * element within the dialog has the `mdcFocusInitial` directive. */ @Directive({ - selector: '[mdcDialogCancel]' + selector: '[mdcDialogDefault]', + providers: [{provide: AbstractMdcFocusInitial, useExisting: forwardRef(() => MdcDialogDefaultDirective) }] }) -export class MdcDialogCancelDirective { - @HostBinding('class.mdc-dialog__footer__button--cancel') _cls = true; +export class MdcDialogDefaultDirective extends AbstractMdcFocusInitial { + /** @internal */ readonly priority = 0; // must be lower than prio of MdcFocusInitialDirective constructor(public _elm: ElementRef) { + super(); } } /** - * Directive for the backdrop of a dialog. The backdrop provides the styles for overlaying the - * page content when the dialog is opened. This guides user attention to the dialog. + * Directive for the surface of a dialog. The surface contains the actual content of a dialog, + * wrapped in elements with the `mdcDialogHeader`, `mdcDialogContent`, and `mdcDialogActions` + * directives. + * + * # Accessibility + * * The role attribute will be set to `alertdialog` by default + * * The `aria-modal` attribute will be set to `true` by default + * * If there is an `mdcDialogTitle`, the `aria-labelledBy` attribute will be set to the id + * of that element (and a unique id will be assigned to it, if none was provided) + * * If there is an `mdcDialogContent`, the `aria-describedby` attribute will be set to the + * id of that element (and a unique id will be assigned to it, if none was provided) */ @Directive({ - selector: '[mdcDialogBackdrop]' + selector: '[mdcDialogSurface]' }) -export class MdcDialogBackdropDirective { - @HostBinding('class.mdc-dialog__backdrop') _cls = true; +export class MdcDialogSurfaceDirective { + /** @internal */ + @HostBinding('class.mdc-dialog__surface') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role = 'alertdialog'; + /** @internal */ + @HostBinding('attr.aria-modal') _modal = 'true'; + /** @internal */ + @HostBinding('attr.aria-labelledby') _labelledBy: string | null = null; + /** @internal */ + @HostBinding('attr.aria-describedby') _describedBy: string | null = null; + /** @internal */ + @ContentChildren(MdcDialogTitleDirective) _titles?: QueryList; + /** @internal */ + @ContentChildren(MdcDialogContentDirective) _contents?: QueryList; + + ngAfterContentInit() { + this._titles!.changes.subscribe(() => this.setAriaLabels()); + this._contents!.changes.subscribe(() => this.setAriaLabels()); + this.setAriaLabels(); + } + + private setAriaLabels() { + this._labelledBy = this._titles!.first?.id; + this._describedBy = this._contents!.first?.id; + } } /** - * Directive for the surface of a dialog. The surface contains the actual comtent of a dialog, - * wrapped in elements with the mdcDialogHeader, mdcDialogBody, - * and mdcDialogFooter directives. + * This directive should be the first child of an `mdcDialog`, and contains the `mdcDialogSurface`. */ @Directive({ - selector: '[mdcDialogSurface]' + selector: '[mdcDialogContainer]' }) -export class MdcDialogSurfaceDirective { - @HostBinding('class.mdc-dialog__surface') _cls = true; +export class MdcDialogContainerDirective { + /** @internal */ + @HostBinding('class.mdc-dialog__container') readonly _cls = true; +} - constructor(public _elm: ElementRef) { - } +/** + * Directive for the backdrop of a dialog. The backdrop provides the styles for overlaying the + * page content when the dialog is opened. This guides user attention to the dialog. + */ +@Directive({ + selector: '[mdcDialogScrim]' +}) +export class MdcDialogScrimDirective { + /** @internal */ + @HostBinding('class.mdc-dialog__scrim') readonly _cls = true; } /** @@ -169,93 +208,141 @@ export class MdcDialogSurfaceDirective { * child elements: a surface (marked with the mdcDialogSurface directive), and a * backdrop (marked with the mdcDialogBackdrop directive). * - * For an accessible user experience, the surface behind the dialog should not be accessible. - * This can be achieved by adding the mdcFocusTrap directive to the dialog element - * as well. + * When the dialog is opened, it will activate a focus trap on the elements within the dialog, + * so that the surface behind the dialog is not accessible. See `mdcFocusTrap` for more information. */ @Directive({ selector: '[mdcDialog]', exportAs: 'mdcDialog' }) export class MdcDialogDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-dialog') _cls = true; - @ContentChild(MdcDialogSurfaceDirective) _surface: MdcDialogSurfaceDirective; - @ContentChildren(MdcDialogAcceptDirective, {descendants: true}) _accept: QueryList; - @ContentChildren(MdcDialogCancelDirective, {descendants: true}) _cancel: QueryList; + /** @internal */ + @HostBinding('class.mdc-dialog') readonly _cls = true; + /** @internal */ + @ContentChild(MdcDialogSurfaceDirective) _surface: MdcDialogSurfaceDirective | null = null; + /** @internal */ + @ContentChildren(MdcDialogTriggerDirective, {descendants: true}) _triggers?: QueryList; + /** @internal */ + @ContentChildren(MdcDialogContentDirective, {descendants: true}) _contents?: QueryList; + /** @internal */ + @ContentChildren(MdcDialogActionsDirective, {descendants: true}) _footers?: QueryList; + /** @internal */ + @ContentChildren(MdcDialogDefaultDirective, {descendants: true}) _defaultActions?: QueryList; + /** + * Event emitted when the user accepts the dialog, e.g. by pressing enter or clicking the button + * with `mdcDialogTrigger="accept"`. + */ + @Output() readonly accept: EventEmitter = new EventEmitter(); + /** + * Event emitted when the user cancels the dialog, e.g. by clicking outside the dialog, pressing the escape key, + * or clicking an element with `mdcDialogTrigger="close"`. + */ + @Output() readonly cancel: EventEmitter = new EventEmitter(); /** - * Event emitted when the user accepts the dialog, e.g. by clicking the accept (mdcDialogAccept) - * button. + * Event emitted when the dialog starts opening. */ - @Output() accept: EventEmitter = new EventEmitter(); + @Output() readonly opening: EventEmitter = new EventEmitter(); /** - * Event emitted when the user cancels the dialog, e.g. by clicking the cancel (mdcDialogCancel) - * button, or by pressing the Escape key (for dialogs with a focus-trap that is configured to close on Escape) + * Event emitted when the dialog is opened. */ - @Output() cancel: EventEmitter = new EventEmitter(); - private _initialized = false; - private focusTrapHandle: FocusTrapHandle; - private mdcAdapter: MdcDialogAdapter = { + @Output() readonly opened: EventEmitter = new EventEmitter(); + /** + * Event emitted when the dialog starts closing. The 'action' field contains the reason for closing, see + * `mdcDialogTrigger` for more information. + */ + @Output() readonly closing: EventEmitter<{action: string}> = new EventEmitter(); + /** + * Event emitted when the dialog is closed. The 'action' field contains the reason for closing, see + * `mdcDialogTrigger` for more information. + */ + @Output() readonly closed: EventEmitter<{action: string}> = new EventEmitter(); + private _onDocumentKeydown = (event: KeyboardEvent) => this.onDocumentKeydown(event); + private focusTrapHandle: FocusTrapHandle | null = null; + private mdcAdapter: MDCDialogAdapter = { addClass: (className: string) => this._rndr.addClass(this._elm.nativeElement, className), removeClass: (className: string) => this._rndr.removeClass(this._elm.nativeElement, className), - addBodyClass: (className: string) => this._rndr.addClass(document.body, className), - removeBodyClass: (className: string) => this._rndr.removeClass(document.body, className), - eventTargetHasClass: (target: HTMLElement, className: string) => { - if (className === 'mdc-dialog__footer__button--accept') - return this._accept.find((e) => e._elm.nativeElement === target) != null; - else if (className === 'mdc-dialog__footer__button--cancel') - return this._cancel.find((e) => e._elm.nativeElement === target) != null; - return target.classList.contains(className); + addBodyClass: (className: string) => this._rndr.addClass(this.document.body, className), + removeBodyClass: (className: string) => this._rndr.removeClass(this.document.body, className), + areButtonsStacked: () => this._footers?.first ? util.areTopsMisaligned(this._footers.first?._buttons!.map(b => b._elm.nativeElement)) : false, + clickDefaultButton: () => this._defaultActions?.first?._elm.nativeElement.click(), + eventTargetMatches: (target, selector) => target ? ponyfill.matches(target as Element, selector) : false, + getActionFromEvent: (evt: Event) => { + const action = this.closest(evt.target as Element, this._triggers!.toArray()); + return action?.mdcDialogTrigger || null; }, - registerInteractionHandler: (evt: string, handler: EventListener) => this._registry.listen(this._rndr, evt, handler, this._elm), - deregisterInteractionHandler: (evt: string, handler: EventListener) => this._registry.unlisten(evt, handler), - registerSurfaceInteractionHandler: (evt: string, handler: EventListener) => { - if (this._surface) - this._registry.listen(this._rndr, evt, handler, this._surface._elm); - + getInitialFocusEl: () => null, // ignored in our implementation. mdcFocusTrap determines this by itself + hasClass: (className) => { + if (className === cssClasses.STACKED) + return false; // currently not supporting (auto-)stacking of buttons + return this._elm.nativeElement.classList.contains(className); }, - deregisterSurfaceInteractionHandler: (evt: string, handler: EventListener) => this._registry.unlisten(evt, handler), - registerDocumentKeydownHandler: (handler: EventListener) => this._registry.listenElm(this._rndr, 'keydown', handler, document.body), - deregisterDocumentKeydownHandler: (handler: EventListener) => this._registry.unlisten('keydown', handler), - registerTransitionEndHandler: (handler: EventListener) => { - if (this._surface) - this._registry.listen(this._rndr, 'transitionend', handler, this._surface._elm); + isContentScrollable: () => util.isScrollable(this._content?._elm.nativeElement), + notifyClosed: (action) => { + this.closed.emit({action}); }, - deregisterTransitionEndHandler: (handler: EventListener) => this._registry.unlisten('transitionend', handler), - notifyAccept: () => this.accept.emit(), - notifyCancel: () => this.cancel.emit(), - trapFocusOnSurface: () => this.trapFocus(), - untrapFocusOnSurface: () => this.untrapFocus(), - isDialog: (el: Element) => this._surface && el === this._surface._elm.nativeElement + notifyClosing: (action) => { + this.document.removeEventListener('keydown', this._onDocumentKeydown); + this.closing.emit({action}); + if (action === 'accept') + this.accept.emit(); + else if (action === 'close') + this.cancel.emit(); + }, + notifyOpened: () => { + this.opened.emit(); + }, + notifyOpening: () => { + this.document.addEventListener('keydown', this._onDocumentKeydown); + this.opening.emit(); + }, + releaseFocus: () => this.untrapFocus(), + // we're currently not supporting auto-stacking, cause we can't just reverse buttons in the dom + // and expect that to not break stuff in angular: + reverseButtons: () => undefined, + trapFocus: () => this.trapFocus() }; - private foundation: { - init: Function, - destroy: Function, - open: Function, - close: Function, - isOpen: () => boolean, - accept(shouldNotify: boolean), - cancel(shouldNotify: boolean) - } = new MDCDialogFoundation(this.mdcAdapter); + private foundation: MDCDialogFoundation | null = null; + private document: Document; constructor(private _elm: ElementRef, private _rndr: Renderer2, private _registry: MdcEventRegistry, - @Optional() @Self() private _focusTrap: AbstractMdcFocusTrap) { + @Optional() @Self() private _focusTrap: AbstractMdcFocusTrap, + @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 } ngAfterContentInit() { + this.foundation = new MDCDialogFoundation(this.mdcAdapter); this.foundation.init(); - this._initialized = true; + this.foundation.setAutoStackButtons(false); // currently not supported } ngOnDestroy() { - this._initialized = false; - this.foundation.destroy(); + this.document.removeEventListener('keydown', this._onDocumentKeydown); + this.foundation?.destroy(); + this.foundation = null; } /** * Call this method to open the dialog. */ open() { - this.foundation.open(); + this.foundation!.open(); + } + + /** + * Call this method to close the dialog with the specified action, e.g. `accept` to indicate an acceptance action + * (and trigger the `accept` event), or `close` to indicate dismissal (and trigger the `cancel` event). + */ + close(action = 'close') { + this.foundation!.close(action); + } + + /** + * Recalculates layout and automatically adds/removes modifier classes (for instance to detect if the dialog content + * should be scrollable) + */ + layout() { + this.foundation!.layout(); } private trapFocus() { @@ -270,9 +357,40 @@ export class MdcDialogDirective implements AfterContentInit, OnDestroy { this.focusTrapHandle = null; } } + + /** @internal */ + @HostListener('click', ['$event']) onClick(event: MouseEvent) { + this.foundation?.handleClick(event); + } + + /** @internal */ + @HostListener('keydown', ['$event']) onKeydown(event: KeyboardEvent) { + this.foundation?.handleKeydown(event); + } + + /** @internal */ + onDocumentKeydown(event: KeyboardEvent) { + this.foundation?.handleDocumentKeydown(event); + } + + private get _content() { + return this._contents!.first; + } + + private closest(elm: Element, choices: MdcDialogTriggerDirective[]) { + let match: Element | null = elm; + while (match && match !== this._elm.nativeElement) { + for (let i = 0; i != choices.length; ++i) { + if (choices[i]._elm.nativeElement === match) + return choices[i]; + } + match = match.parentElement; + } + return null; + } } export const DIALOG_DIRECTIVES = [ - MdcDialogDirective, MdcDialogHeaderTitleDirective, MdcDialogHeaderDirective, MdcDialogBodyDirective, - MdcDialogFooterDirective, MdcDialogAcceptDirective, MdcDialogCancelDirective, MdcDialogBackdropDirective, MdcDialogSurfaceDirective, + MdcDialogDirective, MdcDialogTitleDirective, MdcDialogContentDirective, MdcDialogSurfaceDirective, MdcDialogContainerDirective, + MdcDialogActionsDirective, MdcDialogTriggerDirective, MdcDialogDefaultDirective, MdcDialogScrimDirective ]; diff --git a/bundle/src/components/drawer/mdc.drawer.directive.spec.ts b/bundle/src/components/drawer/mdc.drawer.directive.spec.ts new file mode 100644 index 0000000..62dde48 --- /dev/null +++ b/bundle/src/components/drawer/mdc.drawer.directive.spec.ts @@ -0,0 +1,285 @@ +import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { FOCUS_TRAP_DIRECTIVES } from '../focus-trap/mdc.focus-trap.directive'; +import { DRAWER_DIRECTIVES } from './mdc.drawer.directive'; +import { LIST_DIRECTIVES } from '../list/mdc.list.directive'; +import { simulateKey } from '../../testutils/page.test'; + +const templateWithDrawer = ` + +
+
app content
+`; + +describe('MdcDrawerDirective', () => { + @Component({ + template: templateWithDrawer + }) + class TestComponent { + notifications = []; + open = false; + type: 'permanent' | 'dismissible' | 'modal' = 'permanent'; + items = [ + {icon: 'inbox', text: 'Inbox'}, + {icon: 'send', text: 'Outgoing'}, + {icon: 'drafts', text: 'Drafts'}, + ]; + notify(name: string, value: boolean) { + let notification = {}; + notification[name] = value; + this.notifications.push(notification); + } + } + + function setup(type: 'permanent' | 'dismissible' | 'modal', open = false) { + const fixture = TestBed.configureTestingModule({ + declarations: [...DRAWER_DIRECTIVES, ...FOCUS_TRAP_DIRECTIVES, ...LIST_DIRECTIVES, TestComponent] + }).createComponent(TestComponent); + const testComponent = fixture.debugElement.injector.get(TestComponent); + testComponent.type = type; + testComponent.open = open; + fixture.detectChanges(); + const drawer: HTMLElement = fixture.nativeElement.querySelector('#drawer'); + const appContent: HTMLElement = fixture.nativeElement.querySelector('#appContent'); + if (open) + animationCycle(drawer); + //const mdcDrawer = fixture.debugElement.query(By.directive(MdcDrawerDirective)).injector.get(MdcDrawerDirective); + return { fixture, testComponent, drawer, appContent }; + } + + it('dismissible: structure', fakeAsync(() => { + const { fixture, testComponent, drawer, appContent } = setup('dismissible'); + validateDom(drawer, { + type: 'dismissible', + open: false + }); + + testComponent.open = true; + fixture.detectChanges(); + animationCycle(drawer); + validateDom(drawer, { + type: 'dismissible' + }); + expect(appContent.classList).toContain('mdc-drawer-app-content'); + })); + + it('modal: structure', fakeAsync(() => { + const { fixture, testComponent, drawer, appContent } = setup('modal'); + validateDom(drawer, { + type: 'modal', + open: false + }); + + testComponent.open = true; + fixture.detectChanges(); + animationCycle(drawer); + validateDom(drawer, { + type: 'modal' + }); + expect(appContent.classList).not.toContain('mdc-drawer-app-content'); + })); + + it('permanent: structure', fakeAsync(() => { + const { fixture, drawer, appContent } = setup('permanent'); + fixture.detectChanges(); + validateDom(drawer, { + type: 'permanent', + open: true + }); + expect(appContent.classList).not.toContain('mdc-drawer-app-content'); + })); + + it('close while opening is handled correctly', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('modal', true); + testComponent.open = false; + animationCycle(drawer); + // the first animationCycle completes the opening transition: + validateDom(drawer, { + type: 'modal', + open: true + }); + fixture.detectChanges(); + animationCycle(drawer); + // the next animationCycle completes the closing transition: + validateDom(drawer, { + type: 'modal', + open: false + }); + })); + + it('modal: should trap focus to the drawer when opened', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('modal', true); + // when open: should have focus trap sentinels: + expect([...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')].length).toBe(2); + testComponent.open = false; + fixture.detectChanges(); + animationCycle(drawer); + // focus trap should be cleaned up: + expect([...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')].length).toBe(0); + })); + + it('modal: clicking scrim closes the modal', fakeAsync(() => { + const { fixture, drawer } = setup('modal', true); + validateDom(drawer, {type: 'modal', open: true}); + const scrim = fixture.nativeElement.querySelector('#scrim'); + scrim.click(); + animationCycle(drawer); + validateDom(drawer, {type: 'modal', open: false}); + })); + + it('modal: ESCAPE closes the modal', fakeAsync(() => { + const { drawer } = setup('modal', true); + validateDom(drawer, {type: 'modal', open: true}); + simulateKey(drawer, 'Escape'); + animationCycle(drawer); + validateDom(drawer, {type: 'modal', open: false}); + })); + + it('modal: should emit the afterOpened/afterClosed/openChange events', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('modal', false); + expect(testComponent.notifications).toEqual([]); + testComponent.open = true; + fixture.detectChanges(); animationCycle(drawer); + expect(testComponent.notifications).toEqual([ + {open: true}, + {afterOpened: true} + ]); + testComponent.notifications = []; + testComponent.open = false; + fixture.detectChanges(); animationCycle(drawer); + expect(testComponent.notifications).toEqual([ + {open: false}, + {afterClosed: true} + ]); + })); + + it('dismissible: should emit the afterOpened/afterClosed/openChange events', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('dismissible', false); + expect(testComponent.notifications).toEqual([]); + testComponent.open = true; + fixture.detectChanges(); animationCycle(drawer); + expect(testComponent.notifications).toEqual([ + {open: true}, + {afterOpened: true} + ]); + testComponent.notifications = []; + testComponent.open = false; + fixture.detectChanges(); animationCycle(drawer); + expect(testComponent.notifications).toEqual([ + {open: false}, + {afterClosed: true} + ]); + })); + + it('change type from dismissible to modal when open', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('dismissible', true); + validateDom(drawer, { + type: 'dismissible' + }); + document.body.focus(); // make sure the drawer is not focused (trapFocus must be called and focus it when changin type) + expect(document.activeElement).toBe(document.body); + testComponent.type = 'modal'; + fixture.detectChanges(); animationCycle(drawer); + validateDom(drawer, { + type: 'modal' + }); + })); + + it('change type from permanent to modal when open is set', fakeAsync(() => { + const { fixture, testComponent, drawer } = setup('permanent', true); + validateDom(drawer, { + type: 'permanent' + }); + document.body.focus(); // make sure the drawer is not focused (trapFocus must be called and focus it when changin type) + expect(document.activeElement).toBe(document.body); + testComponent.type = 'modal'; + fixture.detectChanges(); animationCycle(drawer); + validateDom(drawer, { + type: 'modal', + open: true + }); + })); + + function validateDom(drawer, options: Partial<{ + type: 'permanent' | 'dismissible' | 'modal', + open: boolean, + list: boolean + }> = {}) { + options = {...{ + type: 'permanent', + open: true, + list: true + }, ...options}; + + expect(drawer.classList).toContain('mdc-drawer'); + expect(drawer.classList).not.toContain('mdc-drawer--animate'); + expect(drawer.classList).not.toContain('mdc-drawer--opening'); + expect(drawer.classList).not.toContain('mdc-drawer--closing'); + switch (options.type) { + case 'dismissible': + expect(drawer.classList).toContain('mdc-drawer--dismissible'); + expect(drawer.classList).not.toContain('mdc-drawer--modal'); + break; + case 'modal': + expect(drawer.classList).toContain('mdc-drawer--modal'); + expect(drawer.classList).not.toContain('mdc-drawer--dismissible'); + break; + default: + expect(drawer.classList).not.toContain('mdc-drawer--modal'); + expect(drawer.classList).not.toContain('mdc-drawer--dismissible'); + } + if (options.open && options.type !== 'permanent') + expect(drawer.classList).toContain('mdc-drawer--open'); + else + expect(drawer.classList).not.toContain('mdc-drawer--open'); + // when modal and open, there are focus-trap sentinel children: + expect(drawer.children.length).toBe(options.open && options.type === 'modal' ? 3 : 1); + const content = drawer.children[options.open && options.type === 'modal' ? 1 : 0]; + expect(content.classList).toContain('mdc-drawer__content'); + if (options.list) { + expect(content.children.length).toBe(1); + const list = content.children[0]; + expect(list.classList).toContain('mdc-list'); + } + if (options.open && options.type === 'modal') { + let drawerIsActive = false; + let active = document.activeElement; + while (active) { + if (active === drawer) { + drawerIsActive = true; + break; + } + active = active.parentElement; + } + expect(drawerIsActive).toBeTrue(); + } + } + + function animationCycle(drawer: HTMLElement) { + tick(20); + if (drawer.classList.contains('mdc-drawer--dismissible') || drawer.classList.contains('mdc-drawer--modal')) { + let event = new TransitionEvent('transitionend'); + event.initEvent('transitionend', true, true); + drawer.dispatchEvent(event); + } + } + + function newKeydownEvent(key: string) { + let event = new KeyboardEvent('keydown', {key}); + event.initEvent('keydown', true, true); + return event; + } +}); diff --git a/bundle/src/components/drawer/mdc.drawer.directive.ts b/bundle/src/components/drawer/mdc.drawer.directive.ts index 5e9ec19..2af018f 100644 --- a/bundle/src/components/drawer/mdc.drawer.directive.ts +++ b/bundle/src/components/drawer/mdc.drawer.directive.ts @@ -1,339 +1,358 @@ -import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, - HostBinding, Input, OnDestroy, Output, QueryList, Renderer2 } from '@angular/core'; -import { FOCUSABLE_ELEMENTS } from '@material/drawer/slidable'; -import { MDCPersistentDrawerFoundation, MDCTemporaryDrawerFoundation, util } from '@material/drawer'; -import { MdcSlidableDrawerAdapter } from './mdc.slidable.drawer.adapter'; -import { MdcPersistentDrawerAdapter } from './mdc.persistent.drawer.adapter'; -import { MdcTemporaryDrawerAdapter } from './mdc.temporary.drawer.adapter'; -import { AbstractDrawerElement, MdcDrawerType } from '../abstract/abstract.mdc.drawer.element'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -/** - * A toolbar spacer is an optional first child of an mdcDrawer. - * A toolbar spacer adds space to the drawer in the same amount of the space that the toolbar takes up in your application. - * This is useful for visual alignment and consistency. Note that you can place content inside the toolbar spacer. - */ -@Directive({ - selector: '[mdcDrawerToolbarSpacer]', - providers: [{provide: AbstractDrawerElement, useExisting: forwardRef(() => MdcDrawerToolbarSpacerDirective) }] -}) -export class MdcDrawerToolbarSpacerDirective extends AbstractDrawerElement { - @HostBinding('class.mdc-drawer__toolbar-spacer') _cls = true; - - constructor() { - super(); - } -} - -/** - * A toolbar header is an optional first child of an mdcDrawer. - * A toolbar header adds space to create a 16:9 drawer header. - * It's often used for user account selection or profile information. - * - * To place content inside a toolbar header, add a child element with the - * mdcDrawerHeaderContent directive. - */ -@Directive({ - selector: '[mdcDrawerHeader]', - providers: [{provide: AbstractDrawerElement, useExisting: forwardRef(() => MdcDrawerHeaderDirective) }] -}) -export class MdcDrawerHeaderDirective extends AbstractDrawerElement { - @HostBinding('class.mdc-drawer__header') _cls = true; - - constructor() { - super(); - } -} - -/** - * Directive for the content of a drawer header. This should be the child of an - * mdcDrawerHeader directive. The content of the header will be bottom - * aligned. - */ -@Directive({ - selector: '[mdcDrawerHeaderContent]', - providers: [{provide: AbstractDrawerElement, useExisting: forwardRef(() => MdcDrawerHeaderContentDirective) }] -}) -export class MdcDrawerHeaderContentDirective extends AbstractDrawerElement { - @HostBinding('class.mdc-drawer__header-content') _cls = true; - - constructor() { - super(); - } -} - -/** - * Directive for the drawer content. You would typically also apply the mdcList - * or mdcListGroup directive to the drawer content (see the examples). - */ -@Directive({ - selector: '[mdcDrawerContent]', - providers: [{provide: AbstractDrawerElement, useExisting: forwardRef(() => MdcDrawerContentDirective) }] -}) -export class MdcDrawerContentDirective extends AbstractDrawerElement { - @HostBinding('class.mdc-drawer__content') _cls = true; - - constructor() { - super(); - } -} - -/** - * A standalone mdcDrawer is a permanent drawer. A permanent - * drawer is always open, sitting to the side of the content. It is appropriate for any - * display size larger than mobile. - * - * To make a drawer that can be opened/closed, wrap the mdcDrawer inside an - * mdcDrawerContainer. That makes the drawer a persistent or - * temporary drawer. See MdcDrawerContainerDirective for more information. - */ -@Directive({ - selector: '[mdcDrawer]', - providers: [{provide: AbstractDrawerElement, useExisting: forwardRef(() => MdcDrawerDirective) }] -}) -export class MdcDrawerDirective implements AfterContentInit { - private initialized = false; - private type: MdcDrawerType = 'permanent'; - @ContentChildren(AbstractDrawerElement, {descendants: true}) _children: QueryList; - - constructor(public _elm: ElementRef) { - } - - ngAfterContentInit() { - this.initialized = true; - this.updateTypeForChildren(); - this._children.changes.subscribe(() => { - this.updateTypeForChildren(); - }); - } - - private updateTypeForChildren() { - if (this.initialized) { - this._children.forEach(child => { - child._drawerType = this.type; - }); - } - } - - _setType(drawerType: MdcDrawerType) { - this.type = drawerType; - this.updateTypeForChildren(); - } - - @HostBinding('class.mdc-drawer--permanent') get _isPermanent() { - return this.type === 'permanent'; - } - - @HostBinding('class.mdc-drawer__drawer') get _isContainedDrawer() { - return this.type === 'persistent' || this.type === 'temporary'; - } -} - -/** - * Wrap an mdcDrawer inside a mdcDrawerContainer to make it a - * persistent or temporary drawer. Persistent and temporary drawers are slideable: they - * can be opened or closed by the user, or by code. - */ -@Directive({ - selector: '[mdcDrawerContainer]' -}) -export class MdcDrawerContainerDirective implements AfterContentInit, OnDestroy { - private initialized = false; - private openMem: boolean; - private mdcAdapter: MdcSlidableDrawerAdapter; - @ContentChildren(MdcDrawerDirective) _drawers: QueryList; - /** - * Event emitted when the drawer is opened or closed. The event value will be - * true when the drawer is opened, and false when the - * drawer is closed. - */ - @Output() openChange: EventEmitter = new EventEmitter(); - private type: 'persistent' | 'temporary' = 'persistent'; - private foundation: { - init(), - destroy(), - open(), - close(), - isOpen(): boolean - }; - - constructor(protected _elm: ElementRef, protected _rndr: Renderer2, protected _registry: MdcEventRegistry) {} - - ngAfterContentInit() { - this.initialized = true; - this.updateType(); - this.initDrawer(); - this._drawers.changes.subscribe(() => { - this.updateType(); - }); - } - - ngOnDestroy() { - this.destroyDrawer(); - } - - private updateType() { - if (this.initialized) - this.forDrawer((d) => {d._setType(this.type); }); - } - - private destroyDrawer() { - if (this.foundation) { - this.openMem = this.foundation.isOpen(); - this.foundation.destroy(); - this.foundation = null; - } - } - - private initDrawer() { - if (this.initialized) { - this.destroyDrawer(); - if (this.hasNecessaryDom()) { - this.createAdapter(); - let newFoundation = this.type === 'temporary' ? - new MDCTemporaryDrawerFoundation(this.mdcAdapter) : - new MDCPersistentDrawerFoundation(this.mdcAdapter); - // first init, then assign to this.foundation, so that - // this.openMem is used to detect the open state, instead - // of the new foundation (which would never be opened otherwise): - newFoundation.init(); - this.open = this.openMem; - this.foundation = newFoundation; - } else - console.error('mdcDrawerContainer can\'t be constructed because of missing DOM elements'); - } - } - - private createAdapter() { - let adapter: MdcPersistentDrawerAdapter | MdcTemporaryDrawerAdapter = { - addClass: (className) => { - if ('mdc-drawer--open' !== className) // *--open is tracked by HostBinding - this._rndr.addClass(this._elm.nativeElement, className); - }, - removeClass: (className) => { - if ('mdc-drawer--open' !== className) // *--open is tracked by HostBinding - this._rndr.removeClass(this._elm.nativeElement, className); - }, - hasClass: (className) => { - if ('mdc-drawer--persistent' === className) - return this.type === 'persistent'; - else if ('mdc-drawer--temporary' === className) - return this.type === 'temporary'; - else if ('mdc-drawer--open' === className) - return this.open; - else - return this._elm.nativeElement.classList.contains(className); - }, - hasNecessaryDom: () => this.hasNecessaryDom(), - registerInteractionHandler: (evt, handler) => this._registry.listen(this._rndr, util.remapEvent(evt), handler, this._elm, util.applyPassive()), - deregisterInteractionHandler: (evt, handler) => this._registry.unlisten(util.remapEvent(evt), handler), - registerDrawerInteractionHandler: (evt, handler) => this._registry.listen(this._rndr, util.remapEvent(evt), handler, this.drawer._elm), - deregisterDrawerInteractionHandler: (evt, handler) => this._registry.unlisten(util.remapEvent(evt), handler), - registerTransitionEndHandler: (handler) => this._registry.listen(this._rndr, 'transitionend', handler, this._elm), - deregisterTransitionEndHandler: (handler) => this._registry.unlisten('transitionend', handler), - registerDocumentKeydownHandler: (handler) => this._registry.listenElm(this._rndr, 'keydown', handler, document), - deregisterDocumentKeydownHandler: (handler) => this._registry.unlisten('keydown', handler), - setTranslateX: (value) => this.forDrawer((d) => { - return d._elm.nativeElement.style.setProperty(util.getTransformPropertyName(), - value === null ? null : `translateX(${value}px)`); - }), - getFocusableElements: () => this.forDrawer((d) => { - return d._elm.nativeElement.querySelectorAll(FOCUSABLE_ELEMENTS); - }), - saveElementTabState: (el) => util.saveElementTabState(el), - restoreElementTabState: (el) => util.restoreElementTabState(el), - makeElementUntabbable: (el: HTMLElement) => el.tabIndex = -1, - notifyOpen: () => this.openChange.emit(true), - notifyClose: () => this.openChange.emit(false), - isRtl: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', - getDrawerWidth: () => this.forDrawer((d) => d._elm.nativeElement.offsetWidth, 0), - isDrawer: (el: Element) => (this.drawer && this.drawer._elm.nativeElement === el), - - // for the temporary drawer: - addBodyClass: (className: string) => {this._rndr.addClass(document.body, className); }, - removeBodyClass: (className: string) => {this._rndr.removeClass(document.body, className); }, - updateCssVariable: (value: string) => { - if (util.supportsCssCustomProperties()) - this._elm.nativeElement.style.setProperty(MDCTemporaryDrawerFoundation.strings.OPACITY_VAR_NAME, value); - }, - eventTargetHasClass: (target: HTMLElement, className: string) => { - if (target === this._elm.nativeElement && className === 'mdc-drawer--temporary') - // make sure this returns true even if class HostBinding is not effectuated yet: - return this.type === 'temporary'; - return target.classList.contains(className); - } - }; - this.mdcAdapter = adapter; - } - - private hasNecessaryDom() { - return this.drawer != null; - } - - private get drawer(): MdcDrawerDirective { - if (this._drawers && this._drawers.length > 0) - return this._drawers.first; - return null; - } - - private forDrawer(func: (drawer: MdcDrawerDirective) => T, defaultVal: T = null) { - let theDrawer = this.drawer; - return theDrawer ? func(theDrawer) : defaultVal; - } - - /** - * Set the type of drawer. Either persistent or temporary. - * The default (when no value given) is persistent. Please note that - * a third type of drawer exists: the permanent drawer. But a permanent - * drawer is created by not wrapping your mdcDrawer in a - * mdcDrawerContainer. - */ - @Input() get mdcDrawerContainer(): 'persistent' | 'temporary' | null { - return this.type; - } - - set mdcDrawerContainer(value: 'persistent' | 'temporary' | null) { - if (value !== 'persistent' && value !== 'temporary') - value = 'persistent'; - if (value !== this.type) { - this.type = value; - this.updateType(); - this.initDrawer(); - } - } - - @HostBinding('class.mdc-drawer--persistent') get _isPersistent() { - return this.type === 'persistent'; - } - - @HostBinding('class.mdc-drawer--temporary') get _isTemporary() { - return this.type === 'temporary'; - } - - @HostBinding('class.mdc-drawer--open') get _isOpenCls() { - return (this.type === 'persistent' || this.type === 'temporary') && this.open; - } - - /** - * Input to open (assign value true) or close (assign value false) - * the drawer. - */ - @Input() get open() { - return this.foundation ? this.foundation.isOpen() : this.openMem; - } - - set open(value: any) { - let newValue = asBoolean(value); - if (newValue !== this.open) { - this.openMem = newValue; - if (this.foundation) { - if (newValue) - this.foundation.open(); - else - this.foundation.close(); - } else - this.openChange.emit(newValue); - } - } -} +import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, + Input, OnDestroy, Output, QueryList, Renderer2, Inject, Optional, Self, HostListener } from '@angular/core'; +import { MDCDismissibleDrawerFoundation, MDCModalDrawerFoundation, MDCDrawerAdapter } from '@material/drawer'; +import { asBoolean } from '../../utils/value.utils'; +import { DOCUMENT } from '@angular/common'; +import { AbstractMdcFocusTrap, FocusTrapHandle } from '../focus-trap/abstract.mdc.focus-trap'; +import { MdcListItemDirective } from '../list/mdc.list.directive'; + +/** + * Directive for the title of a drawer. The use of this directive is optional. + * If used, it should be placed as first element inside an `mdcDrawerHeader` + */ +@Directive({ + selector: '[mdcDrawerTitle]' +}) +export class MdcDrawerTitleDirective { + /** @internal */ + @HostBinding('class.mdc-drawer__title') readonly _cls = true; +} + +/** + * Directive for the subtitle of a drawer. The use of this directive is optional. + * If used, it should be placed as a sibling element of `mdcDrawerTitle` + * inside an `mdcDrawerHeader` + */ +@Directive({ + selector: '[mdcDrawerSubtitle]' +}) +export class MdcDrawerSubtitleDirective { + /** @internal */ + @HostBinding('class.mdc-drawer__subtitle') readonly _cls = true; +} + +/** + * A toolbar header is an optional first child of an `mdcDrawer`. + * The header will not scroll with the rest of the drawer content, so is a + * good place to place titles and account switchers. + * + * Directives that are typically used inside an `mdcDrawerHeader`: + * `mdcDrawerTitle`, and `mdcDrawerSubTitle` + */ +@Directive({ + selector: '[mdcDrawerHeader]' +}) +export class MdcDrawerHeaderDirective { + /** @internal */ + @HostBinding('class.mdc-drawer__header') readonly _cls = true; +} + +/** + * Directive for the drawer content. You would typically also apply the `mdcList` + * or `mdcListGroup` directive to the drawer content (see the examples). + */ +@Directive({ + selector: '[mdcDrawerContent]' +}) +export class MdcDrawerContentDirective { + /** @internal */ + @HostBinding('class.mdc-drawer__content') readonly _cls = true; +} + +@Directive({ + selector: '[mdcDrawerScrim]' +}) +export class MdcDrawerScrimDirective { + /** @internal */ + @HostBinding('class.mdc-drawer-scrim') readonly _cls = true; +} + +/** + * Directive for a (navigation) drawer. The following drawer types are + * supported: + * * `permanent`: the default type if none was specified. + * * `dismissible`: the drawer is hidden by default, and can slide into view. + * Typically used when navigation is not common, and the main app content is + * prioritized. + * * `modal`: the drawer is hidden by default. When activated, the drawer is elevated + * above the UI of the app. It uses a scrim to block interaction with the rest of + * the app with a scrim. + * + * Drawers may contain an `mdcDrawerHeader`, and should contain an `mdcDrawerContent` + * directive. + */ +@Directive({ + selector: '[mdcDrawer]' +}) +export class MdcDrawerDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-drawer') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcListItemDirective, {descendants: true}) _items?: QueryList; + private _onDocumentClick = (event: MouseEvent) => this.onDocumentClick(event); + private focusTrapHandle: FocusTrapHandle | null = null; + private type: 'permanent' | 'dismissible' | 'modal' = 'permanent'; + private previousFocus: Element | HTMLOrSVGElement | null = null; + private _open: boolean | null = null; + private document: Document; + private mdcAdapter: MDCDrawerAdapter = { + addClass: (className) => this._rndr.addClass(this._elm.nativeElement, className), + removeClass: (className) => this._rndr.removeClass(this._elm.nativeElement, className), + hasClass: (className) => this._elm.nativeElement.classList.contains(className), + elementHasClass: (element, className) => element.classList.contains(className), + saveFocus: () => this.previousFocus = this.document.activeElement, + restoreFocus: () => { + const prev = this.previousFocus as HTMLOrSVGElement | null; + if (prev && prev.focus && this._elm.nativeElement.contains(this.document.activeElement)) + prev.focus(); + }, + focusActiveNavigationItem: () => { + const active = this._items!.find(item => item.active); + active?._elm.nativeElement.focus(); + }, + notifyClose: () => { + this.fixOpenClose(false); + this.afterClosed.emit(); + this.document.removeEventListener('click', this._onDocumentClick); + }, + notifyOpen: () => { + this.fixOpenClose(true); + this.afterOpened.emit(); + if (this.type === 'modal') + this.document.addEventListener('click', this._onDocumentClick); + }, + trapFocus: () => this.trapFocus(), + releaseFocus: () => this.untrapFocus() + }; + private foundation: MDCDismissibleDrawerFoundation | null = null; // MDCModalDrawerFoundation extends MDCDismissibleDrawerFoundation + /** + * Event emitted when the drawer is opened or closed. The event value will be + * `true` when the drawer is opened, and `false` when the + * drawer is closed. (When this event is triggered, the drawer is starting to open/close, + * but the animation may not have fully completed yet) + */ + @Output() readonly openChange: EventEmitter = new EventEmitter(); + /** + * Event emitted after the drawer has fully opened. When this event is emitted the full + * opening animation has completed, and the drawer is visible. + */ + @Output() readonly afterOpened: EventEmitter = new EventEmitter(); + /** + * Event emitted after the drawer has fully closed. When this event is emitted the full + * closing animation has completed, and the drawer is not visible anymore. + */ + @Output() readonly afterClosed: EventEmitter = new EventEmitter(); + + constructor(public _elm: ElementRef, protected _rndr: Renderer2, @Inject(DOCUMENT) doc: any, + @Optional() @Self() private _focusTrap: AbstractMdcFocusTrap) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 + } + + ngAfterContentInit() { + this.initDrawer(); + } + + ngOnDestroy() { + this.destroyDrawer(); + } + + private destroyDrawer() { + // when foundation is reconstructed and then .open() is called, + // if these classes are still available the foundation assumes open was already called, + // and it won't do anything: + this._rndr.removeClass(this._elm.nativeElement, 'mdc-drawer--animate'); + this._rndr.removeClass(this._elm.nativeElement, 'mdc-drawer--closing'); + this._rndr.removeClass(this._elm.nativeElement, 'mdc-drawer--open'); + this._rndr.removeClass(this._elm.nativeElement, 'mdc-drawer--opening'); + if (this.foundation) { + this.document.removeEventListener('click', this._onDocumentClick); + this.foundation.destroy(); + this.foundation = null; + } + } + + private initDrawer() { + this.destroyDrawer(); + let newFoundation: MDCDismissibleDrawerFoundation | null = null; + const thiz = this; + if (this.type === 'dismissible') + newFoundation = new class extends MDCDismissibleDrawerFoundation{ + close() { + const emit = thiz._open; + thiz._open = false; + super.close(); + emit ? thiz.openChange.emit(thiz._open) : undefined; + } + open() { + const emit = !thiz._open; + thiz._open = true; + super.open(); + emit ? thiz.openChange.emit(thiz._open) : undefined; + } + }(this.mdcAdapter); + else if (this.type === 'modal') + newFoundation = new class extends MDCModalDrawerFoundation{ + close() { + const emit = thiz._open; + thiz._open = false; + super.close(); + emit ? thiz.openChange.emit(thiz._open) : undefined; + } + open() { + const emit = !thiz._open; + thiz._open = true; + super.open(); + emit ? thiz.openChange.emit(thiz._open) : undefined; + } + }(this.mdcAdapter); + // else: permanent drawer -> doesn't need a foundation, just styling + if (newFoundation) { + this.foundation = newFoundation; + newFoundation.init(); + if (this._open) + newFoundation.open(); + } + } + + /** @internal */ + @HostBinding('class.mdc-drawer--modal') get _isModal() { + return this.type === 'modal'; + } + + /** @internal */ + @HostBinding('class.mdc-drawer--dismissible') get _isDismisible() { + return this.type === 'dismissible'; + } + + /** + * Set the type of drawer. Either `permanent`, `dismissible`, or `modal`. + * The default type is `permanent`. + */ + @Input() get mdcDrawer(): 'permanent' | 'dismissible' | 'modal' { + return this.type; + } + + set mdcDrawer(value: 'permanent' | 'dismissible' | 'modal') { + if (value !== 'dismissible' && value !== 'modal') + value = 'permanent'; + if (value !== this.type) { + this.type = value; + this.initDrawer(); + } + } + + static ngAcceptInputType_mdcDrawer: 'permanent' | 'dismissible' | 'modal' | ''; + + /** + * Input to open (assign value `true`) or close (assign value `false`) + * the drawer. + */ + @Input() get open() { + return !!this._open; + } + + set open(value: boolean) { + let newValue = asBoolean(value); + if (newValue !== this._open) { + if (this.foundation) { + newValue ? this.foundation.open() : this.foundation.close(); + } else { + this._open = newValue; + this.openChange.emit(newValue); + } + } + } + + static ngAcceptInputType_open: boolean | ''; + + private fixOpenClose(open: boolean) { + // the foundation ignores calls to open/close while an opening/closing animation is running. + // so when the animation ends, we're just going to try again + // (needs to be done in the next micro cycle, because otherwise foundation will still think it's + // running the opening/closing animation): + Promise.resolve().then(() => { + if (this._open !== open) { + if (this._open) + this.foundation!.open(); + else + this.foundation!.close(); + } + }); + } + + private trapFocus() { + this.untrapFocus(); + if (this._focusTrap) + this.focusTrapHandle = this._focusTrap.trapFocus(); + } + + private untrapFocus() { + if (this.focusTrapHandle && this.focusTrapHandle.active) { + this.focusTrapHandle.untrap(); + this.focusTrapHandle = null; + } + } + + /** @internal */ + @HostListener('keydown', ['$event']) onKeydown(event: KeyboardEvent) { + this.foundation?.handleKeydown(event); + } + + /** @internal */ + @HostListener('transitionend', ['$event']) handleTransitionEnd(event: TransitionEvent) { + this.foundation?.handleTransitionEnd(event); + } + + /** @internal */ + onDocumentClick(event: MouseEvent) { + if (this.type === 'modal') { + // instead of listening to click event on mdcDrawerScrim (which would require wiring between + // mdcDrawerScrim and mdcDrawer), we just listen to document clicks. + let el: Element | null = event.target as Element; + while (el) { + if (el === this._elm.nativeElement) + return; + el = el.parentElement; + } + (this.foundation as MDCModalDrawerFoundation)?.handleScrimClick(); + } + } +} + +/** + * Use this directive for marking the sibling element after a dismissible `mdcDrawer`. + * This will apply styling so that the open/close animations work correctly. + */ +@Directive({ + selector: '[mdcDrawerAppContent]' +}) +export class MdcDrawerAppContent { + /** @internal */ + @HostBinding('class.mdc-drawer-app-content') _cls = true; + + /** + * Set this to false to disable the styling for sibbling app content of a dismissible drawer. + * This is typically only used when your `mdcDrawer` type is dynamic. In those cases you can + * disable the `mdcDrawerAppContent` when you set your drawer type to anything other than + * `dismissible`. + */ + @Input() get mdcDrawerAppContent() { + return this._cls; + } + + set mdcDrawerAppContent(value: boolean) { + this._cls = asBoolean(value); + } + + static ngAcceptInputType_mdcDrawerAppContent: boolean | ''; +} + +export const DRAWER_DIRECTIVES = [ + MdcDrawerTitleDirective, + MdcDrawerSubtitleDirective, + MdcDrawerHeaderDirective, + MdcDrawerContentDirective, + MdcDrawerScrimDirective, + MdcDrawerDirective, + MdcDrawerAppContent +]; diff --git a/bundle/src/components/drawer/mdc.persistent.drawer.adapter.ts b/bundle/src/components/drawer/mdc.persistent.drawer.adapter.ts deleted file mode 100644 index a3aa88b..0000000 --- a/bundle/src/components/drawer/mdc.persistent.drawer.adapter.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { MdcSlidableDrawerAdapter } from './mdc.slidable.drawer.adapter'; - -/** @docs-private */ -export interface MdcPersistentDrawerAdapter extends MdcSlidableDrawerAdapter { -} diff --git a/bundle/src/components/drawer/mdc.slidable.drawer.adapter.ts b/bundle/src/components/drawer/mdc.slidable.drawer.adapter.ts deleted file mode 100644 index 774a0a2..0000000 --- a/bundle/src/components/drawer/mdc.slidable.drawer.adapter.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** @docs-private */ -export interface MdcSlidableDrawerAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - hasClass: (className: string) => boolean; - hasNecessaryDom: () => boolean; - registerInteractionHandler: (evt: string, handler: EventListener) => void; - deregisterInteractionHandler: (evt: string, handler: EventListener) => void; - registerDrawerInteractionHandler: (evt: string, handler: EventListener) => void; - deregisterDrawerInteractionHandler: (evt: string, handler: EventListener) => void; - registerTransitionEndHandler: (handler: EventListener) => void; - deregisterTransitionEndHandler: (handler: EventListener) => void; - registerDocumentKeydownHandler: (handler: EventListener) => void; - deregisterDocumentKeydownHandler: (handler: EventListener) => void; - setTranslateX: (value: number) => void; - getFocusableElements: () => NodeListOf; - saveElementTabState: (el: Element) => void; - restoreElementTabState: (el: Element) => void; - makeElementUntabbable: (el: Element) => void; - notifyOpen: () => void; - notifyClose: () => void; - isRtl: () => boolean; - getDrawerWidth: () => number; - // allthough in the MDC code this is not listed as member for the slidable/temporary - // drawer, the code still calls it, and the implementation returns false for temporary - // drawer: - isDrawer: (el: Element) => boolean; -} diff --git a/bundle/src/components/drawer/mdc.temporary.drawer.adapter.ts b/bundle/src/components/drawer/mdc.temporary.drawer.adapter.ts deleted file mode 100644 index f483e63..0000000 --- a/bundle/src/components/drawer/mdc.temporary.drawer.adapter.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { MdcSlidableDrawerAdapter } from './mdc.slidable.drawer.adapter'; - -/** @docs-private */ -export interface MdcTemporaryDrawerAdapter extends MdcSlidableDrawerAdapter { - addBodyClass: (className: string) => void; - removeBodyClass: (className: string) => void; - updateCssVariable: (value: string) => void; - eventTargetHasClass: (target: HTMLElement, className: string) => boolean; -} diff --git a/bundle/src/components/elevation/mdc.elevation.directive.spec.ts b/bundle/src/components/elevation/mdc.elevation.directive.spec.ts index 9cfe6b3..e6f2491 100644 --- a/bundle/src/components/elevation/mdc.elevation.directive.spec.ts +++ b/bundle/src/components/elevation/mdc.elevation.directive.spec.ts @@ -42,7 +42,6 @@ describe('MdcElevationDirective', () => { it('should change elevation when property changes with numeric values', (() => { const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); verifyElevationChange(0, 0, fixture); verifyElevationChange(-1, 0, fixture); @@ -53,7 +52,6 @@ describe('MdcElevationDirective', () => { it('should change elevation when property changes with string values', (() => { const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); verifyElevationChange('0', 0, fixture); verifyElevationChange('-1', 0, fixture); @@ -64,7 +62,6 @@ describe('MdcElevationDirective', () => { it('should change elevation when property changes with invalid type values', (() => { const { fixture } = setup(); - const testComponent = fixture.debugElement.injector.get(TestComponent); verifyElevationChange(true, 1, fixture); verifyElevationChange(false, 0, fixture); diff --git a/bundle/src/components/elevation/mdc.elevation.directive.ts b/bundle/src/components/elevation/mdc.elevation.directive.ts index 3128a84..5c07300 100644 --- a/bundle/src/components/elevation/mdc.elevation.directive.ts +++ b/bundle/src/components/elevation/mdc.elevation.directive.ts @@ -1,8 +1,5 @@ -import { Directive, ElementRef, HostBinding, Input, Renderer2 } from '@angular/core'; -import { MDCRipple } from '@material/ripple'; -import { MDCRippleFoundation } from '@material/ripple'; -import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; -import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; +import { Directive, ElementRef, HostBinding, Input, OnInit, Renderer2 } from '@angular/core'; +import { asBoolean } from '../../utils/value.utils'; /** * Directive for elevating an element above its surface. @@ -11,8 +8,8 @@ import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; selector: '[mdcElevation]' }) export class MdcElevationDirective { - private _z: number = null; - private _transition; + private _z: number | null = null; + private _transition: boolean = false; constructor(private rndr: Renderer2, private _elm: ElementRef) { } @@ -22,11 +19,11 @@ export class MdcElevationDirective { * When set to 0, the element will not be elevated! The default value is 1. */ @Input() get mdcElevation() { - return this._z; + return this._z == null ? 1 : this._z; } - set mdcElevation(value: string | number) { - let newValue = (value == null || value === '') ? 1 : +value; + set mdcElevation(value: number) { + let newValue = (value == null || value === '') ? 1 : +value; if (newValue < 0) newValue = 0; if (newValue > 24) @@ -41,6 +38,8 @@ export class MdcElevationDirective { this._z = newValue; } + static ngAcceptInputType_mdcElevation: string | number; + /** * When this input is defined and does not have value false, changes of the elevation * will be animated. @@ -50,7 +49,9 @@ export class MdcElevationDirective { return this._transition; } - set animateTransition(value: any) { + set animateTransition(value: boolean) { this._transition = asBoolean(value); } + + static ngAcceptInputType_animateTransition: boolean | ''; } diff --git a/bundle/src/components/fab/mdc.fab.directive.spec.ts b/bundle/src/components/fab/mdc.fab.directive.spec.ts index cc50ce3..6f18863 100644 --- a/bundle/src/components/fab/mdc.fab.directive.spec.ts +++ b/bundle/src/components/fab/mdc.fab.directive.spec.ts @@ -1,13 +1,13 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; +import { TestBed, fakeAsync, flush } from '@angular/core/testing'; import { Component } from '@angular/core'; -import { MdcFabDirective, MdcFabIconDirective } from './mdc.fab.directive'; -import { booleanAttributeStyleTest, hasRipple } from '../../testutils/page.test'; +import { MdcFabDirective, MdcFabIconDirective, MdcFabLabelDirective } from './mdc.fab.directive'; +import { testStyle, hasRipple } from '../../testutils/page.test'; +import { asBoolean } from '../../utils/value.utils'; describe('MdcFabDirective', () => { @Component({ template: ` - @@ -16,12 +16,18 @@ describe('MdcFabDirective', () => { class TestComponent { mini: any = null; exited: any = null; - extended: any = null; + _extended = false; + get extended() { + return this._extended; + } + set extended(value: any) { + this._extended = asBoolean(value); + } } function setup() { const fixture = TestBed.configureTestingModule({ - declarations: [MdcFabDirective, MdcFabIconDirective, TestComponent] + declarations: [MdcFabDirective, MdcFabLabelDirective, MdcFabIconDirective, TestComponent] }).createComponent(TestComponent); fixture.detectChanges(); return { fixture }; @@ -42,26 +48,16 @@ describe('MdcFabDirective', () => { it('should style according to the value of the mini property', (() => { const { fixture } = setup(); - testStyle(fixture, 'mini', 'mdc-fab--mini'); + testStyle(fixture, 'mini', 'mini', 'mdc-fab--mini', MdcFabDirective, TestComponent); })); it('should style according to the value of the exited property', (() => { const { fixture } = setup(); - testStyle(fixture, 'exited', 'mdc-fab--exited'); + testStyle(fixture, 'exited', 'exited', 'mdc-fab--exited', MdcFabDirective, TestComponent); })); - it('should style according to the value of the extended property', (() => { + it('should set extended styling for fabs with labels', fakeAsync(() => { const { fixture } = setup(); - testStyle(fixture, 'extended', 'mdc-fab--extended'); + testStyle(fixture, 'extended', 'extended', 'mdc-fab--extended', MdcFabDirective, TestComponent); })); - - const testStyle = (fixture: ComponentFixture, property: string, style: string) => { - const fab = fixture.debugElement.query(By.directive(MdcFabDirective)).injector.get(MdcFabDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); - // initial the styles are not set: - expect(fab[property]).toBe(false); - expect(fab._elm.nativeElement.classList.contains(style)).toBe(false); - // test various ways to set the property value, and the result of having the class or not: - booleanAttributeStyleTest(fixture, testComponent, fab, property, property, style); - } }); diff --git a/bundle/src/components/fab/mdc.fab.directive.ts b/bundle/src/components/fab/mdc.fab.directive.ts index 6ad1d43..d343c00 100644 --- a/bundle/src/components/fab/mdc.fab.directive.ts +++ b/bundle/src/components/fab/mdc.fab.directive.ts @@ -1,24 +1,23 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2, forwardRef } from '@angular/core'; -import { MDCRipple } from '@material/ripple'; +import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2, forwardRef, ContentChild, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** * Directive for the icon of a Floating Action Button - * (mdcFab). The icon of a Floating Action Button is - * optional when the extended property is set. + * (`mdcFab`). */ @Directive({ selector: '[mdcFabIcon]' }) export class MdcFabIconDirective { - @HostBinding('class.mdc-fab__icon') _cls = true; + @HostBinding('class.mdc-fab__icon') readonly _cls = true; } /** * Directive for the label of an extended Floating Action Button - * (mdcFab). The label may be placed before or after the icon. + * (`mdcFab`). The label may be placed before or after the icon. * It is also possible to only have a label for an extended Floating Action * Button. */ @@ -26,25 +25,30 @@ export class MdcFabIconDirective { selector: '[mdcFabLabel]' }) export class MdcFabLabelDirective { - @HostBinding('class.mdc-fab__label') _cls = true; + @HostBinding('class.mdc-fab__label') readonly _cls = true; } /** * Material design Floating Action Button. The element should embed - * an icon element with the MdcFabIconDirective. + * an icon element with the `mdcFabIcon`, or (to make it an extended floating action button) + * a label with the `mdcFabLabel` directive. Extended floating actions button may (in addition + * to the label) also add an `mdcFabIcon` before or after the label. */ @Directive({ selector: '[mdcFab]', providers: [{provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcFabDirective) }] }) export class MdcFabDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-fab') _cls = true; + /** @internal */ + @HostBinding('class.mdc-fab') readonly _cls = true; + /** @internal */ + @ContentChild(MdcFabLabelDirective) _label?: MdcFabLabelDirective; private _mini = false; - private _extended = false; private _exited = false; - constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry) { - super(_elm, renderer, registry); + constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, renderer, registry, doc as Document); + this.addRippleSurface('mdc-fab__ripple'); } ngAfterContentInit() { @@ -64,22 +68,15 @@ export class MdcFabDirective extends AbstractMdcRipple implements AfterContentIn return this._mini; } - set mini(val: any) { + set mini(val: boolean) { this._mini = asBoolean(val); } - /** - * When this input is defined and does not have value false, the FAB will - * be extended to a wider size which includes a text label. Use directive - * mdcFabLabel for the text label. - */ - @HostBinding('class.mdc-fab--extended') @Input() - get extended() { - return this._extended; - } + static ngAcceptInputType_mini: boolean | ''; - set extended(val: any) { - this._extended = asBoolean(val); + /** @docs-private */ + @HostBinding('class.mdc-fab--extended') get extended() { + return !!this._label; } /** @@ -91,9 +88,11 @@ export class MdcFabDirective extends AbstractMdcRipple implements AfterContentIn return this._exited; } - set exited(val: any) { + set exited(val: boolean) { this._exited = asBoolean(val); } + + static ngAcceptInputType_exited: boolean | ''; } export const FAB_DIRECTIVES = [ diff --git a/bundle/src/components/floating-label/mdc.floating-label.adapter.ts b/bundle/src/components/floating-label/mdc.floating-label.adapter.ts deleted file mode 100644 index abf37fa..0000000 --- a/bundle/src/components/floating-label/mdc.floating-label.adapter.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { MDCTextFieldHelperTextFoundation } from '@material/textfield/helper-text'; - -/** @docs-private */ -export interface MdcFloatingLabelAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - getWidth: () => number, - registerInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterInteractionHandler: (evtType: string, handler: EventListener) => void, -} diff --git a/bundle/src/components/floating-label/mdc.floating-label.directive.ts b/bundle/src/components/floating-label/mdc.floating-label.directive.ts index 1db0c51..496a633 100644 --- a/bundle/src/components/floating-label/mdc.floating-label.directive.ts +++ b/bundle/src/components/floating-label/mdc.floating-label.directive.ts @@ -1,13 +1,18 @@ import { AfterContentInit, Directive, ElementRef, forwardRef, HostBinding, - OnDestroy, Renderer2 } from '@angular/core'; -import { MDCFloatingLabelFoundation } from '@material/floating-label'; -import { MdcFloatingLabelAdapter } from './mdc.floating-label.adapter'; + OnDestroy, Renderer2, OnInit } from '@angular/core'; +import { MDCFloatingLabelFoundation, MDCFloatingLabelAdapter } from '@material/floating-label'; +import { ponyfill } from '@material/dom'; import { AbstractMdcLabel } from '../abstract/abstract.mdc.label'; -import { asBoolean } from '../../utils/value.utils'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; +import { HasId } from '../abstract/mixin.mdc.hasid'; +import { applyMixins } from '../../utils/mixins'; +@Directive() +class MdcFloatingLabelDirectiveBase {} +interface MdcFloatingLabelDirectiveBase extends HasId {} +applyMixins(MdcFloatingLabelDirectiveBase, [HasId]); /** - * Directive for the floating label of input fields. Flaoting labels are used by + * Directive for the floating label of input fields. Floating labels are used by * mdcTextField and mdcSelect to display the type of input * the field requires. Floating labels are resting when the field is inactive, and * float when the field is active. @@ -18,48 +23,60 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; * to the id of the parent mdcInput. */ @Directive({ - selector: 'label[mdcFloatingLabel]', + selector: '[mdcFloatingLabel]', providers: [{provide: AbstractMdcLabel, useExisting: forwardRef(() => MdcFloatingLabelDirective) }] }) -export class MdcFloatingLabelDirective extends AbstractMdcLabel implements AfterContentInit, OnDestroy { - _initialized = false; - /** @docs-private */ - @HostBinding() for: string; - @HostBinding('class.mdc-floating-label') _cls = true; - _mdcAdapter: MdcFloatingLabelAdapter = { +export class MdcFloatingLabelDirective extends MdcFloatingLabelDirectiveBase implements AfterContentInit, OnDestroy, OnInit { + /** @internal */ + @HostBinding('attr.for') for: string | null = null; + /** @internal */ + @HostBinding('class.mdc-floating-label') readonly _cls = true; + private _mdcAdapter: MDCFloatingLabelAdapter = { addClass: (className: string) => { this._rndr.addClass(this._elm.nativeElement, className); }, removeClass: (className: string) => { this._rndr.removeClass(this._elm.nativeElement, className); }, - getWidth:() => this._elm.nativeElement.offsetWidth, - registerInteractionHandler: (type: string, handler: EventListener) => { + getWidth:() => ponyfill.estimateScrollWidth(this._elm.nativeElement), + registerInteractionHandler: (type, handler) => { this.registry.listen(this._rndr, type, handler, this._elm); }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { + deregisterInteractionHandler: (type, handler) => { this.registry.unlisten(type, handler); } }; - _foundation: { - init: Function, - destroy: Function, - float: (should: boolean) => void, - shake: (should: boolean) => void, - getWidth: () => number - } = new MDCFloatingLabelFoundation(this._mdcAdapter); + private _foundation = new MDCFloatingLabelFoundation(this._mdcAdapter); constructor(private _rndr: Renderer2, public _elm: ElementRef, private registry: MdcEventRegistry) { super(); } + ngOnInit() { + this.initId(); + } + ngAfterContentInit() { this._foundation.init(); - this._initialized = true; } ngOnDestroy() { - this._foundation.init(); - this._initialized = false; + this._foundation.destroy(); + } + + shake(shouldShake: boolean) { + this._foundation.shake(shouldShake); + } + + float(shouldFloat: boolean) { + this._foundation.float(shouldFloat); + } + + getWidth(): number { + return this._foundation.getWidth(); + } + + isLabelElement() { + return this._elm.nativeElement.nodeName.toLowerCase() === 'label'; } } diff --git a/bundle/src/components/focus-trap/abstract.mdc.focus-trap.ts b/bundle/src/components/focus-trap/abstract.mdc.focus-trap.ts index c065ede..d4e5abe 100644 --- a/bundle/src/components/focus-trap/abstract.mdc.focus-trap.ts +++ b/bundle/src/components/focus-trap/abstract.mdc.focus-trap.ts @@ -3,13 +3,13 @@ import { ElementRef } from '@angular/core'; /** @docs-private */ export interface FocusTrapHandle { readonly active: boolean; - untrap(); + untrap(): void; } /** @docs-private */ export abstract class AbstractMdcFocusInitial { - /** @docs-private */ readonly priority: number; - readonly _elm: ElementRef; + /** @internal */ readonly priority: number | null = null; + /** @internal */ readonly _elm: ElementRef | null = null; } /** @docs-private */ diff --git a/bundle/src/components/focus-trap/mdc.focus-trap.directive.spec.ts b/bundle/src/components/focus-trap/mdc.focus-trap.directive.spec.ts index f36db6d..d812344 100644 --- a/bundle/src/components/focus-trap/mdc.focus-trap.directive.spec.ts +++ b/bundle/src/components/focus-trap/mdc.focus-trap.directive.spec.ts @@ -1,10 +1,9 @@ import { Component } from '@angular/core'; -import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed, fakeAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { FOCUS_TRAP_DIRECTIVES, MdcFocusInitialDirective, MdcFocusTrapDirective } from './mdc.focus-trap.directive'; -import { cancelledClick, simulateEscape } from '../../testutils/page.test'; -describe('MdcFocusTrapDirective', () => { +describe('mdcFocusTrap', () => { @Component({ template: ` outside 1 @@ -23,91 +22,45 @@ describe('MdcFocusTrapDirective', () => { declarations: [...FOCUS_TRAP_DIRECTIVES, TestComponent] }).createComponent(TestComponent); fixture.detectChanges(); - return { fixture }; + const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); + const anchors = [...fixture.nativeElement.querySelectorAll('a')]; + expect(anchors.length).toBe(4); + return { fixture, mdcFocusTrap, anchors }; } it('should not trap the focus when not activated', (() => { const { fixture } = setup(); - const anchors = fixture.nativeElement.querySelectorAll('a'); - expect(anchors.length).toBe(4); - - // check that clicks on the anchors are not cancelled: - for (let i = 0; i != anchors.length; ++i) { - expect(cancelledClick(anchors[i])).toBe(false); - } + const sentinels = [...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')]; + expect(sentinels.length).toBe(0); })); - it('should trap the focus when activated', fakeAsync(() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); - const anchors = fixture.nativeElement.querySelectorAll('a'); - expect(anchors.length).toBe(4); - - anchors[3].focus(); + it('should trap focus when activated', (() => { + const { fixture, mdcFocusTrap, anchors } = setup(); + anchors[0].focus(); let trap = mdcFocusTrap.trapFocus(); - tick(); // member element is focused with a 0ms delay. - expect(document.activeElement).toBe(anchors[1]); // first element of trap focused - expect(cancelledClick(anchors[0])).toBe(true); // outside focus trap - expect(cancelledClick(anchors[1])).toBe(false); - expect(cancelledClick(anchors[2])).toBe(false); - expect(cancelledClick(anchors[3])).toBe(true); // outside focus trap - // none of this should have affected the trap: expect(trap.active).toBe(true); - trap.untrap(); - expect(trap.active).toBe(false); - tick(); // restoring old focus is async - expect(document.activeElement).toBe(anchors[3]); // focus returns to previously focused element - // no more canceling of clicks: - expect(cancelledClick(anchors[0])).toBe(false); - expect(cancelledClick(anchors[1])).toBe(false); - expect(cancelledClick(anchors[2])).toBe(false); - expect(cancelledClick(anchors[3])).toBe(false); - })); - - it('should deactivate on outside click when untrapOnOutsideClick is set', fakeAsync(() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); - mdcFocusTrap.untrapOnOutsideClick = true; - const anchors = fixture.nativeElement.querySelectorAll('a'); - expect(anchors.length).toBe(4); - - anchors[3].focus(); - let trap = mdcFocusTrap.trapFocus(); - tick(); // member element is focused with a 0ms delay. - expect(document.activeElement).toBe(anchors[1]); // first element of trap focused - // clicks outside trap are not cancelled, but deactivate the trap: - expect(cancelledClick(anchors[0])).toBe(false); - expect(trap.active).toBe(false); - })); - it('should honor the ignoreEscape setting', (() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); - const anchors = fixture.nativeElement.querySelectorAll('a'); + // should have moved focus to first element: + expect(document.activeElement).toBe(anchors[1]); + // sentinels are added to trap the focus: + const sentinels = [...fixture.nativeElement.querySelectorAll('.mdc-dom-focus-sentinel')]; + expect(sentinels.length).toBe(2); + // when trying to focus before the region, the trap focuses the last element: + sentinels[0].dispatchEvent(new Event('focus')); + expect(document.activeElement).toBe(anchors[2]); + // when trying to focus after the region, the trap focuses the last element: + sentinels[1].dispatchEvent(new Event('focus')); + expect(document.activeElement).toBe(anchors[1]); - let trap = mdcFocusTrap.trapFocus(); - expect(trap.active).toBe(true); - simulateEscape(); - expect(trap.active).toBe(false); trap.untrap(); + expect(trap.active).toBe(false); + // element from before tarp should have gotten focus back: + expect(document.activeElement).toBe(anchors[0]); - mdcFocusTrap.ignoreEscape = true; - trap = mdcFocusTrap.trapFocus(); - expect(trap.active).toBe(true); - simulateEscape(); - expect(trap.active).toBe(true); - })); - - it('should be initialized with the correct defaults', (() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); - expect(mdcFocusTrap.ignoreEscape).toBe(false); - expect(mdcFocusTrap.untrapOnOutsideClick).toBe(false); })); - it('stacking of traps is not yet supported', (() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); + it('can not activate when a trap is already active', (() => { + const { mdcFocusTrap } = setup(); let trap1 = mdcFocusTrap.trapFocus(); let error: Error = null; @@ -132,8 +85,7 @@ describe('MdcFocusTrapDirective', () => { let leftActiveTrap = null; it('should deactivate on destroy', (() => { - const { fixture } = setup(); - const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); + const { mdcFocusTrap } = setup(); leftActiveTrap = mdcFocusTrap.trapFocus(); expect(leftActiveTrap.active).toBe(true); @@ -150,7 +102,7 @@ describe('MdcFocusTrapDirective', () => { }); }); -describe('MdcFocusInitialDirective', () => { +describe('mdcFocusInitial', () => { @Component({ template: ` outside 1 @@ -169,21 +121,19 @@ describe('MdcFocusInitialDirective', () => { declarations: [MdcFocusTrapDirective, MdcFocusInitialDirective, TestComponent] }).createComponent(TestComponent); fixture.detectChanges(); - return { fixture }; - } - - it('should get focus when trap activates', fakeAsync(() => { - const { fixture } = setup(); const mdcFocusTrap = fixture.debugElement.query(By.directive(MdcFocusTrapDirective)).injector.get(MdcFocusTrapDirective); const anchors = fixture.nativeElement.querySelectorAll('a'); expect(anchors.length).toBe(4); - + return { fixture, mdcFocusTrap, anchors }; + } + + it('should get focus when trap activates', fakeAsync(() => { + const { mdcFocusTrap, anchors } = setup(); + anchors[3].focus(); let trap = mdcFocusTrap.trapFocus(); - tick(); // member element is focused with a 0ms delay. expect(document.activeElement).toBe(anchors[2]); // mdcFocusInitial trap.untrap(); - tick(); // restoring old focus is async expect(document.activeElement).toBe(anchors[3]); // focus returns to previously focused element })); }); diff --git a/bundle/src/components/focus-trap/mdc.focus-trap.directive.ts b/bundle/src/components/focus-trap/mdc.focus-trap.directive.ts index c061d92..cac7007 100644 --- a/bundle/src/components/focus-trap/mdc.focus-trap.directive.ts +++ b/bundle/src/components/focus-trap/mdc.focus-trap.directive.ts @@ -1,7 +1,5 @@ import { ContentChildren, Directive, ElementRef, Input, OnDestroy, QueryList, forwardRef } from '@angular/core'; -import createFocusTrap from 'focus-trap'; -import { Options, FocusTrap } from "focus-trap"; -import { asBoolean } from '../../utils/value.utils'; +import { focusTrap } from '@material/dom'; import { AbstractMdcFocusTrap, AbstractMdcFocusInitial, FocusTrapHandle } from './abstract.mdc.focus-trap'; /** @@ -13,27 +11,39 @@ import { AbstractMdcFocusTrap, AbstractMdcFocusInitial, FocusTrapHandle } from ' providers: [{provide: AbstractMdcFocusInitial, useExisting: forwardRef(() => MdcFocusInitialDirective) }] }) export class MdcFocusInitialDirective extends AbstractMdcFocusInitial { - /** @docs-private */ readonly priority = 100; + /** @internal */ readonly priority = 100; constructor(public _elm: ElementRef) { super(); } } +let activeTrap: FocusTrapHandleImpl | null = null; + /** @docs-private */ class FocusTrapHandleImpl implements FocusTrapHandle { private _active = true; - private trap: FocusTrap; + private trap: focusTrap.FocusTrap | null = null; - constructor(public _elm: ElementRef, options: Options) { - options.onActivate = () => { this._active = true; activeTrap = this; }; - options.onDeactivate = () => { this._active = false; activeTrap = null; }; - this.trap = createFocusTrap(_elm.nativeElement, options); - this.trap.activate(); + constructor(public _elm: ElementRef, focusElm: HTMLElement | null, skipFocus: boolean) { + if (activeTrap) + // Stacking focus tracks (i.e. changing to another focus trap, and returning + // to the previous on deactivation) is not supported: + throw new Error('An mdcFocusTrap is already active.'); + this.trap = new focusTrap.FocusTrap(_elm.nativeElement, { + initialFocusEl: focusElm || undefined, + skipInitialFocus: skipFocus + }); + this.trap.trapFocus(); + activeTrap = this; } untrap() { - this.trap.deactivate(); + this._active = false; + if (activeTrap === this) { + activeTrap = null; + this.trap!.releaseFocus(); + } } get active() { @@ -41,24 +51,27 @@ class FocusTrapHandleImpl implements FocusTrapHandle { } } -let activeTrap: FocusTrapHandleImpl = null; - /** - * Directive for trapping focus (by key and/or mouse input) inside an element. To be used + * Directive for trapping the tab key focus within an element. To be used * for e.g. modal dialogs, where focus must be constrained for an accesssible experience. - * Use mdcFocusInitial on a child element if a specific element needs to get - * focus upon activation of the trap. In the absense of an mdcFocusInitial, + * + * This will only trap the keyboard focus (when using tab or shift+tab). It will not prevent the focus from moving + * out of the trapped region due to mouse interaction. You can use a background scrim element that overlays + * the window to achieve that. (Like `mdcDialog` does). + * + * Use `mdcFocusInitial` on a child element if a specific element needs to get + * focus upon activation of the trap. In the absense of an `mdcFocusInitial`, * or when that element can't be focused, the focus trap will activate the first tabbable * child element of the focus trap. */ @Directive({ - selector: '[mdcFocusTrap]', + selector: '[mdcFocusTrap],[mdcDialog],[mdcDrawer]', providers: [{provide: AbstractMdcFocusTrap, useExisting: forwardRef(() => MdcFocusTrapDirective) }] }) export class MdcFocusTrapDirective extends AbstractMdcFocusTrap implements OnDestroy { - private _untrapOnOutsideClick = false; - private _ignoreEscape = false; - @ContentChildren(AbstractMdcFocusInitial, {descendants: true}) _focusInitial: QueryList; + /** @internal */ + @ContentChildren(AbstractMdcFocusInitial, {descendants: true}) _focusInitials?: QueryList; + private trap: FocusTrapHandle | null = null; constructor(private _elm: ElementRef) { super(); @@ -66,54 +79,17 @@ export class MdcFocusTrapDirective extends AbstractMdcFocusTrap implements OnDes ngOnDestroy() { // if this element is destroyed, it must not leave the trap in activated state: - if (activeTrap && activeTrap._elm.nativeElement === this._elm.nativeElement) - activeTrap.untrap(); + if (this.trap) + this.trap.untrap(); + this.trap = null; } /** @docs-private */ trapFocus(): FocusTrapHandle { - if (activeTrap) - // Currently stacking focus tracks (i.e. changing to another focus trap, and returning - // to the previous on deactivation) is not yet supported. Will be in a future release: - throw new Error('An mdcFocusTrap is already active.'); - let options: Options = { - clickOutsideDeactivates: this._untrapOnOutsideClick, - escapeDeactivates: !this._ignoreEscape, - }; - if (this._focusInitial.length > 0) { - let fi: AbstractMdcFocusInitial = null; - this._focusInitial.forEach(focus => fi = (fi == null || fi.priority <= focus.priority) ? focus : fi); - if (fi) - options.initialFocus = fi._elm.nativeElement; - } - return new FocusTrapHandleImpl(this._elm, options); - } - - /** - * Set this property to have clicks outside the focus area untrap the focus. - * The value is taken when the trap is activated. Thus changing the value - * while a focus trap is active does not affect the behavior of that focus trap. - */ - @Input() get untrapOnOutsideClick() { - return this._untrapOnOutsideClick; - } - - set untrapOnOutsideClick(value: any) { - this._untrapOnOutsideClick = asBoolean(value); - } - - /** - * Set this property to ignore the escape key. The default is to deactivate the - * trap when a user presses the escape key. - * The value is taken when the trap is activated. Thus changing the value - * while a focus trap is active does not affect the behavior of that focus trap. - */ - @Input() get ignoreEscape() { - return this._ignoreEscape; - } - - set ignoreEscape(value: any) { - this._ignoreEscape = asBoolean(value); + let focusInitial: AbstractMdcFocusInitial | null = null; + this._focusInitials!.forEach(focus => focusInitial = (focusInitial == null || focusInitial.priority! <= focus.priority!) ? focus : focusInitial); + this.trap = new FocusTrapHandleImpl(this._elm, (focusInitial)?._elm.nativeElement, false); + return this.trap; } } diff --git a/bundle/src/components/form-field/mdc.form-field.adapter.ts b/bundle/src/components/form-field/mdc.form-field.adapter.ts deleted file mode 100644 index f0a103e..0000000 --- a/bundle/src/components/form-field/mdc.form-field.adapter.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** @docs-private */ -export interface MdcFormFieldAdapter { - registerInteractionHandler: (type: string, handler: EventListener) => void; - deregisterInteractionHandler: (type: string, handler: EventListener) => void; - activateInputRipple: () => void; - deactivateInputRipple: () => void; -} diff --git a/bundle/src/components/form-field/mdc.form-field.directive.ts b/bundle/src/components/form-field/mdc.form-field.directive.ts index 4f4d30d..db51202 100644 --- a/bundle/src/components/form-field/mdc.form-field.directive.ts +++ b/bundle/src/components/form-field/mdc.form-field.directive.ts @@ -1,8 +1,7 @@ import { AfterContentInit, ContentChild, ContentChildren, forwardRef, Directive, ElementRef, HostBinding, HostListener, Input, OnDestroy, Optional, Renderer2, Self } from '@angular/core'; import { NgControl } from '@angular/forms'; -import { MDCFormFieldFoundation } from '@material/form-field'; -import { MdcFormFieldAdapter } from './mdc.form-field.adapter'; +import { MDCFormFieldFoundation, MDCFormFieldAdapter } from '@material/form-field'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; import { AbstractMdcLabel } from '../abstract/abstract.mdc.label'; @@ -16,7 +15,7 @@ let nextId = 1; providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcFormFieldInputDirective) }] }) export class MdcFormFieldInputDirective extends AbstractMdcInput { - private _id: string; + private _id: string | null = null; private _disabled = false; constructor(public _elm: ElementRef, @Optional() @Self() public _cntr: NgControl) { @@ -28,18 +27,20 @@ export class MdcFormFieldInputDirective extends AbstractMdcInput { return this._id; } - set id(value: string) { + set id(value: string | null) { this._id = value; } @HostBinding() @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; + return this._cntr ? !!this._cntr.disabled : this._disabled; } - set disabled(value: any) { + set disabled(value: boolean) { this._disabled = asBoolean(value); } + + static ngAcceptInputType_disabled: boolean | ''; } @Directive({ @@ -47,7 +48,7 @@ export class MdcFormFieldInputDirective extends AbstractMdcInput { providers: [{provide: AbstractMdcLabel, useExisting: forwardRef(() => MdcFormFieldLabelDirective) }] }) export class MdcFormFieldLabelDirective extends AbstractMdcLabel { - @HostBinding() @Input() for: string; + @HostBinding() @Input() for: string | null = null; constructor(public _elm: ElementRef) { super(); @@ -58,17 +59,21 @@ export class MdcFormFieldLabelDirective extends AbstractMdcLabel { selector: '[mdcFormField]' }) export class MdcFormFieldDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-form-field') _cls = true; + /** @internal */ + @HostBinding('class.mdc-form-field') readonly _cls = true; private _alignEnd = false; - @ContentChild(AbstractMdcRipple) rippleChild: AbstractMdcRipple; - @ContentChild(AbstractMdcInput) mdcInput: AbstractMdcInput; - @ContentChild(AbstractMdcLabel) mdcLabel: AbstractMdcLabel; + /** @internal */ + @ContentChild(AbstractMdcRipple) rippleChild?: AbstractMdcRipple; + /** @internal */ + @ContentChild(AbstractMdcInput) mdcInput?: AbstractMdcInput; + /** @internal */ + @ContentChild(AbstractMdcLabel) mdcLabel?: AbstractMdcLabel; - private mdcAdapter: MdcFormFieldAdapter = { - registerInteractionHandler: (type: string, handler: EventListener) => { + private mdcAdapter: MDCFormFieldAdapter = { + registerInteractionHandler: (type, handler) => { this.registry.listen(this.renderer, type, handler, this.root); }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { + deregisterInteractionHandler: (type, handler) => { this.registry.unlisten(type, handler); }, activateInputRipple: () => { @@ -80,7 +85,7 @@ export class MdcFormFieldDirective implements AfterContentInit, OnDestroy { this.rippleChild.deactivateRipple(); } }; - private foundation: { init: Function, destroy: Function } = new MDCFormFieldFoundation(this.mdcAdapter); + private foundation: MDCFormFieldFoundation | null = null; constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry) { } @@ -94,18 +99,28 @@ export class MdcFormFieldDirective implements AfterContentInit, OnDestroy { else if (this.mdcLabel.for == null) this.mdcLabel.for = this.mdcInput.id; } + this.foundation = new MDCFormFieldFoundation(this.mdcAdapter); this.foundation.init(); } ngOnDestroy() { - this.foundation.destroy(); + this.foundation?.destroy(); + this.foundation = null; } @Input() @HostBinding('class.mdc-form-field--align-end') get alignEnd() { return this._alignEnd; } - set alignEnd(val: any) { + set alignEnd(val: boolean) { this._alignEnd = asBoolean(val); } + + static ngAcceptInputType_alignEnd: boolean | ''; } + +export const FORM_FIELD_DIRECTIVES = [ + MdcFormFieldInputDirective, + MdcFormFieldLabelDirective, + MdcFormFieldDirective +]; diff --git a/bundle/src/components/icon-button/abstract.mdc.icon.ts b/bundle/src/components/icon-button/abstract.mdc.icon.ts index 21cbcbf..c830f1e 100644 --- a/bundle/src/components/icon-button/abstract.mdc.icon.ts +++ b/bundle/src/components/icon-button/abstract.mdc.icon.ts @@ -1,10 +1,12 @@ -import { ElementRef, Renderer2 } from '@angular/core'; +import { Directive, ElementRef, Inject, Renderer2 } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** @docs-private */ +@Directive() export abstract class AbstractMdcIcon extends AbstractMdcRipple { - constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry) { - super(_elm, renderer, registry); + constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, renderer, registry, doc as Document); } } diff --git a/bundle/src/components/icon-button/mdc.icon-button.adapter.ts b/bundle/src/components/icon-button/mdc.icon-button.adapter.ts deleted file mode 100644 index e245bc0..0000000 --- a/bundle/src/components/icon-button/mdc.icon-button.adapter.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** @docs-private */ -export interface MdcIconButtonToggleAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - registerInteractionHandler: (type: string, handler: EventListener) => void; - deregisterInteractionHandler: (type: string, handler: EventListener) => void; - setText: (text: string) => void; - // getTabIndex/setTabIndex: not used (foundation calls getTabIndex but does nothing with it) - // also, since this is supposed to be a button element, the tabIndex doesn't need tinkering - // with from the foundation, so left out: - // getTabIndex: () => number; - // setTabIndex: (tabIndex: number) => void; - getAttr: (name: string) => string; - setAttr: (name: string, value: string) => void; - // removeAttr is never called by the foundation, left out: - // removeAttr: (name: string) => void; - notifyChange: (evtData: { isOn: boolean }) => void; -} \ No newline at end of file diff --git a/bundle/src/components/icon-button/mdc.icon-button.directive.spec.ts b/bundle/src/components/icon-button/mdc.icon-button.directive.spec.ts index cd7a0f3..89eadda 100644 --- a/bundle/src/components/icon-button/mdc.icon-button.directive.spec.ts +++ b/bundle/src/components/icon-button/mdc.icon-button.directive.spec.ts @@ -1,11 +1,11 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed, fakeAsync, tick, flush, ComponentFixture } from '@angular/core/testing'; import { FormsModule, NgModel } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { Component, ViewChild } from '@angular/core'; -import { MdcIconButtonIconDirective, MdcIconButtonDirective, MdcIconButtonToggleDirective, MdcFormsIconButtonDirective } from './mdc.icon-button.directive'; -import { booleanAttributeStyleTest, hasRipple } from '../../testutils/page.test'; +import { MdcIconButtonDirective, MdcIconToggleDirective, MdcIconDirective, MdcFormsIconButtonDirective } from './mdc.icon-button.directive'; +import { hasRipple } from '../../testutils/page.test'; -describe('mdcIconButton as action button', () => { +describe('mdcIconButton', () => { @Component({ template: ` @@ -34,12 +34,6 @@ describe('mdcIconButton as action button', () => { expect(hasRipple(iconButton)).toBe(true); })); - it('should read behavioral properties from inputs', (() => { - const { fixture } = setup(); - const iconButton = fixture.debugElement.query(By.directive(MdcIconButtonDirective)).injector.get(MdcIconButtonDirective); - expect(iconButton.disabled).toBeFalsy(); - })); - it('should be styled differently when disabled', (() => { const { fixture } = setup(); const iconButton = fixture.nativeElement.querySelector('button'); @@ -55,24 +49,20 @@ describe('mdcIconButton as action button', () => { const iconButton = fixture.nativeElement.querySelector('button'); const testComponent = fixture.debugElement.injector.get(TestComponent); + expect(testComponent.clickCount).toBe(0); iconButton.click(); expect(testComponent.clickCount).toBe(1); })); }); -describe('mdcIconButton as toggle', () => { +describe('mdcIconToggle', () => { @Component({ template: ` - + ` }) class TestComponent { @@ -91,49 +81,23 @@ describe('mdcIconButton as toggle', () => { function setup(testComponentType: any = TestComponent) { const fixture = TestBed.configureTestingModule({ - declarations: [MdcIconButtonToggleDirective, testComponentType] + declarations: [MdcIconToggleDirective, MdcIconDirective, testComponentType] }).createComponent(testComponentType); fixture.detectChanges(); - return { fixture }; + const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); + const element: HTMLButtonElement = fixture.nativeElement.querySelector('.mdc-icon-button'); + const testComponent = fixture.debugElement.injector.get(testComponentType); + return { fixture, iconToggle, element, testComponent }; } it('should render the icon toggles with icon and ripple styles', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.nativeElement.querySelector('button'); - expect(iconToggle.classList).toContain('mdc-icon-button'); - expect(hasRipple(iconToggle)).toBe(true); - })); - - it('should read behavioral properties from inputs', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - expect(iconToggle.iconIsClass).toBeFalsy(); - expect(iconToggle.labelOn).toBe('Remove from favorites'); - expect(iconToggle.labelOff).toBe('Add to favorites'); - expect(iconToggle.iconOn).toBe('favorite'); - expect(iconToggle.iconOff).toBe('favorite_border'); - expect(iconToggle.disabled).toBeFalsy(); - })); - - it('should change appearance when behavioral properties are changed', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - - iconToggle.labelOn = 'Do not like'; - iconToggle.labelOff = 'Like'; - iconToggle.iconOn = 'thumb_up'; - iconToggle.iconOff = 'thumb_down'; - - fixture.detectChanges(); - - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Like'); - expect(iconToggle._elm.nativeElement.textContent).toBe('thumb_down'); + const { element } = setup(); + expect(element.classList).toContain('mdc-icon-button'); + expect(hasRipple(element)).toBe(true); })); it('should be styled differently when disabled', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, iconToggle, testComponent } = setup(); expect(iconToggle.disabled).toBe(false); testComponent.disabled = true; fixture.detectChanges(); @@ -141,39 +105,78 @@ describe('mdcIconButton as toggle', () => { })); it('should toggle state when clicked', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { iconToggle, testComponent, element } = setup(); expect(iconToggle.on).toBe(false); // initial value from 'favorite' property - expect(testComponent.favorite).toBeFalsy(); // not yet initialized, may be undefined or false - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite_border'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Add to favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('false'); - - iconToggle._elm.nativeElement.click(); - fixture.detectChanges(); + expect(testComponent.favorite).toBeUndefined(); // not yet initialized, so undefined (coerced to false on button) + expect(element.classList).not.toContain('mdc-icon-button--on'); + + clickAndCheck(true); + clickAndCheck(false); + clickAndCheck(true); + + function clickAndCheck(expected) { + element.click(); + expect(iconToggle.on).toBe(expected); + expect(testComponent.favorite).toBe(expected); + if (expected) + expect(element.classList).toContain('mdc-icon-button--on'); + else + expect(element.classList).not.toContain('mdc-icon-button--on'); + } + - expect(iconToggle.on).toBe(true); - expect(testComponent.favorite).toBe(true); - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Remove from favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('true'); + })); + + it('aria-pressed should reflect state of toggle', (() => { + const { fixture, testComponent, element } = setup(); - iconToggle._elm.nativeElement.click(); + expect(testComponent.favorite).toBeUndefined(); // not yet initialized, so undefined (coerced to false on button) + expect(element.getAttribute('aria-pressed')).toBe('false'); + element.click(); // user change + expect(element.getAttribute('aria-pressed')).toBe('true'); + testComponent.favorite = false; //programmatic change fixture.detectChanges(); + expect(element.getAttribute('aria-pressed')).toBe('false'); + })); - expect(iconToggle.on).toBe(false); - expect(testComponent.favorite).toBe(false); - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite_border'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Add to favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('false'); + it('label is reflected as aria-label', (() => { + const { element } = setup(); + expect(element.getAttribute('aria-label')).toBe('Add to favorites'); + })); + + it('labelOn and labelOff are reflected as aria-label', (() => { + const { fixture, element, testComponent } = setup(TestLabelOnOffComponent); + expect(element.getAttribute('aria-label')).toBe('Add to favorites'); + testComponent.favorite = true; + fixture.detectChanges(); + expect(element.getAttribute('aria-label')).toBe('Remove from favorites'); + })); + + it('should toggle state when clicked', (() => { + const { iconToggle, testComponent, element } = setup(); + + expect(iconToggle.on).toBe(false); // initial value from 'favorite' property + expect(testComponent.favorite).toBeUndefined(); // not yet initialized, so undefined (coerced to false on button) + expect(element.classList).not.toContain('mdc-icon-button--on'); + + clickAndCheck(true); + clickAndCheck(false); + clickAndCheck(true); + + function clickAndCheck(expected) { + element.click(); + expect(iconToggle.on).toBe(expected); + expect(testComponent.favorite).toBe(expected); + if (expected) + expect(element.classList).toContain('mdc-icon-button--on'); + else + expect(element.classList).not.toContain('mdc-icon-button--on'); + } })); it('value changes must be emitted via onChange', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, iconToggle, testComponent } = setup(); iconToggle._elm.nativeElement.click(); fixture.detectChanges(); expect(testComponent.changes).toEqual([true]); @@ -181,67 +184,54 @@ describe('mdcIconButton as toggle', () => { expect(testComponent.changes).toEqual([true, false]); })); - it("programmatic changes of 'on' should not trigger 'onChange' events", (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + it("programmatic value changes must be emitted via onChange", (() => { + const { fixture, testComponent } = setup(); testComponent.favorite = true; fixture.detectChanges(); testComponent.favorite = false; fixture.detectChanges(); testComponent.favorite = true; fixture.detectChanges(); - expect(testComponent.changes).toEqual([]); + expect(testComponent.changes).toEqual([true, false, true]); })); @Component({ template: ` - ` }) class TestIconIsClassComponent { } - it("iconIsClass property", (() => { - const { fixture } = setup(TestIconIsClassComponent); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - - expect(iconToggle._elm.nativeElement.classList).toContain('fa-heart-o'); - expect(iconToggle._elm.nativeElement.textContent.trim()).toBe(''); - - iconToggle.iconIsClass = true; // setting to existing value should be allowed - // change value: - expect(() => {iconToggle.iconIsClass = false; }).toThrowError(/iconIsClass property.*changed.*/); + it("iconIsClass property", fakeAsync(() => { + const { element } = setup(TestIconIsClassComponent); + expect(element.classList).toContain('mdc-icon-button'); + expect(hasRipple(element)).toBe(true); })); - - it("iconIsClass property can not be changed after initialization", (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - - // change value (default is undefined, so both true and false as value should be rejected after init): - expect(() => {iconToggle.iconIsClass = false; }).toThrowError(/iconIsClass property.*changed.*/); - expect(() => {iconToggle.iconIsClass = true; }).toThrowError(/iconIsClass property.*changed.*/); - })); + @Component({ + template: ` + + ` + }) + class TestLabelOnOffComponent { + favorite = false; + } }); -describe('mdcIconButton with FormsModule', () => { +describe('mdcIconToggle with FormsModule', () => { @Component({ template: ` - + ` }) class TestComponent { @@ -262,16 +252,16 @@ describe('mdcIconButton with FormsModule', () => { function setup() { const fixture = TestBed.configureTestingModule({ imports: [FormsModule], - declarations: [MdcIconButtonToggleDirective, MdcFormsIconButtonDirective, TestComponent] + declarations: [MdcIconToggleDirective, MdcIconDirective, MdcFormsIconButtonDirective, TestComponent] }).createComponent(TestComponent); fixture.detectChanges(); - return { fixture }; + const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); + const testComponent = fixture.debugElement.injector.get(TestComponent); + return { fixture, iconToggle, testComponent }; } it('value changes must be emitted via ngModelChange', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + const { fixture, iconToggle, testComponent } = setup(); iconToggle._elm.nativeElement.click(); fixture.detectChanges(); expect(testComponent.changes).toEqual([true]); @@ -280,21 +270,19 @@ describe('mdcIconButton with FormsModule', () => { expect(testComponent.changes).toEqual([true, false]); })); - it("programmatic changes of 'ngModel' should not trigger 'ngModelChange' events", (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); + it("programmatic changes of 'ngModel don't trigger ngModelChange events", fakeAsync(() => { + const { fixture, testComponent } = setup(); - testComponent.favorite = true; fixture.detectChanges(); - testComponent.favorite = false; fixture.detectChanges(); - testComponent.favorite = true; fixture.detectChanges(); + testComponent.favorite = true; fixture.detectChanges(); flush(); + testComponent.favorite = false; fixture.detectChanges(); flush(); + testComponent.favorite = true; fixture.detectChanges(); flush(); expect(testComponent.changes).toEqual([]); })); it("the disabled property should disable the button", fakeAsync(() => { const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); + const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); const testComponent = fixture.debugElement.injector.get(TestComponent); tick(); expect(iconToggle._elm.nativeElement.disabled).toBe(false); @@ -306,80 +294,3 @@ describe('mdcIconButton with FormsModule', () => { expect(testComponent.ngModel.disabled).toBe(true); })); }); - -describe('MdcIconButton with nested MdcIconButtonIcon', () => { - @Component({ - template: ` - - ` - }) - class TestComponent { - disabled: boolean = false; - like: boolean = true; - } - - function setup() { - const fixture = TestBed.configureTestingModule({ - declarations: [MdcIconButtonToggleDirective, MdcIconButtonIconDirective, TestComponent] - }).createComponent(TestComponent); - fixture.detectChanges(); - return { fixture }; - } - - it('should render iconOn/iconOff styles on the nested element, but ripples on the button', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.nativeElement.querySelector('button#icon'); - expect(iconToggle.classList).toContain('mdc-icon-button'); - expect(hasRipple(iconToggle)).toBe(true); - const icon = iconToggle.querySelector('i.fa'); - expect(icon).toBeDefined(); - expect(icon.classList).toContain('fa-heart'); - expect(icon.classList).toContain('fa'); - })); - - it('should change appearance when behavioral properties are changed', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const icon = fixture.nativeElement.querySelector('i.fa'); - expect(icon.classList).toContain('fa-heart'); - - iconToggle.labelOn = 'Open envelope'; - iconToggle.labelOff = 'Close envelope'; - iconToggle.iconOn = 'fa-envelope'; - iconToggle.iconOff = 'fa-envelope-open-o'; - - fixture.detectChanges(); - - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Open envelope'); - expect(icon.classList.contains('fa-heart')).toBe(false, 'actual classes: ' + icon.classList); - expect(icon.classList).toContain('fa-envelope'); - expect(icon.classList).toContain('fa'); - })); - - it('should toggle state when clicked', (() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconButtonToggleDirective)).injector.get(MdcIconButtonToggleDirective); - const icon = fixture.nativeElement.querySelector('i.fa'); - - expect(icon.classList.contains('fa-heart')).toBe(true, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(false, icon.classList); - - icon.click(); fixture.detectChanges(); - - expect(icon.classList.contains('fa-heart')).toBe(false, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(true, icon.classList); - - icon.click(); fixture.detectChanges(); - - expect(icon.classList.contains('fa-heart')).toBe(true, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(false, icon.classList); - })); -}); diff --git a/bundle/src/components/icon-button/mdc.icon-button.directive.ts b/bundle/src/components/icon-button/mdc.icon-button.directive.ts index c601b26..deeea4a 100644 --- a/bundle/src/components/icon-button/mdc.icon-button.directive.ts +++ b/bundle/src/components/icon-button/mdc.icon-button.directive.ts @@ -1,83 +1,68 @@ -import { AfterContentInit, Directive, ContentChild, ElementRef, EventEmitter, forwardRef, HostBinding, - HostListener, Input, OnDestroy, Output, Renderer2, Self } from '@angular/core'; +import { AfterContentInit, Directive, ElementRef, EventEmitter, forwardRef, HostBinding, + HostListener, Inject, Input, OnDestroy, Output, Renderer2, Self } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { MDCIconButtonToggleFoundation } from '@material/icon-button'; -import { MdcIconButtonToggleAdapter } from './mdc.icon-button.adapter'; -import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; +import { MDCIconButtonToggleFoundation, MDCIconButtonToggleAdapter, MDCIconButtonToggleEventDetail } from '@material/icon-button'; +import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { AbstractMdcIcon } from './abstract.mdc.icon'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -/** - * Directive for an icon nested inside a MdcIconButtonDirective. - * This directive is only required when the icon font for an mdcIconButton - * uses CSS pseudo-elements in order to provide the icon. This is how Font Awesome, and many - * other icon font libraries provide their icons. These pseudo elements would interfere - * with the pseudo elements that mdcIconButton uses to provide a ripple - * effect. This can be solved by having a child element in your mdcIconButton - * and set this directive on it. The icon classes will then be applied to the child - * element, and won't interfere with the icon button pseudo elements anymore. - * - * For icon fonts that don't use pseudo elements (such as the Material - * Design Icons from Google), this directive is not necessary. - */ -@Directive({ - selector: '[mdcIconButtonIcon]' -}) -export class MdcIconButtonIconDirective { -} - /** * Directive for an icon button. Icon buttons can be used with a font icon library such as - * Google Material Icons, or - * svg elements. They provide material styling and a ripple to the icon. Use it on anchor and - * button tags. For toggling icon buttons, see MdcIconButtonToggleDirective. - * When the applied icon font uses CSS pseudo elements, make the icon a child element of the - * mdcIconButton, and give it the mdcIconButtonIcon directive. + * Google Material Icons, SVG + * elements or images. They provide material styling and a ripple to the icon. Use it on anchor and + * button tags. For toggling icon buttons, see `MdcIconToggleDirective`. */ @Directive({ - selector: '[mdcIconButton]:not([iconOn])', + selector: 'button[mdcIconButton],a[mdcIconButton]', providers: [ {provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconButtonDirective) }, {provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconButtonDirective) } ] }) export class MdcIconButtonDirective extends AbstractMdcIcon implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-icon-button') _hostClass = true; - private _disabled = false; + /** @internal */ + @HostBinding('class.mdc-icon-button') readonly _cls = true; - constructor(_elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry) { - super(_elm, renderer, registry); + constructor(_elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, renderer, registry, doc as Document); } ngAfterContentInit() { - this.initRipple(); + this.initRipple(true); } ngOnDestroy() { this.destroyRipple(); } +} + +/** + * Directive for the icon to display on one of the toggle states of an `mdcIconToggle`. See + * `MdcIconToggleDirective` for more information. + */ +@Directive({ + selector: '[mdcIcon]' +}) +export class MdcIconDirective { + /** @internal */ + @HostBinding('class.mdc-icon-button__icon') readonly _cls = true; + /** @internal */ + @HostBinding('class.mdc-icon-button__icon--on') _on = false; /** - * To disable the icon, set this input to true. + * Set this input to false to remove the ripple effect from the surface. */ - @Input() - @HostBinding() - get disabled() { - return this._disabled; - } - - set disabled(value: any) { - this._disabled = asBoolean(value); + @Input() get mdcIcon() { + return this._on ? 'on' : ''; } - /** @docs-private */ - protected isRippleUnbounded() { - return true; + set mdcIcon(value: 'on' | '') { + this._on = value === 'on'; } } - /** * Directive for creating a Material Design icon toggle button: a button that toggles state, and * switches the icon based on the value of the toggle. @@ -87,224 +72,119 @@ export class MdcIconButtonDirective extends AbstractMdcIcon implements AfterCont * then update the child element with the correct icon if it is toggled. */ @Directive({ - selector: '[mdcIconButton][iconOn]', + selector: '[mdcIconToggle]', providers: [ - {provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconButtonToggleDirective) }, - {provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconButtonToggleDirective) } + {provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconToggleDirective) }, + {provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconToggleDirective) } ] }) -export class MdcIconButtonToggleDirective extends AbstractMdcIcon implements AfterContentInit { - @HostBinding('class.mdc-icon-button') _hostClass = true; - @ContentChild(MdcIconButtonIconDirective, {read: ElementRef}) _innerIcon: ElementRef; +export class MdcIconToggleDirective extends AbstractMdcIcon implements AfterContentInit { + /** @internal */ + @HostBinding('class.mdc-icon-button') readonly _cls = true; + /** + * The aria-label to assign to the icon toggle. You can override the value for the + * on respectively off state by assigning to property `labelOn` or `labelOff`. + */ + @Input() label: string | null = null; + /** + * The aria-label to assign to the icon toggle when it is on. If this input has no value, + * the aria-label will default to the value of the `label` input. + */ + @Input() labelOn: string | null = null; + /** + * The aria-label to assign to the icon toggle when it is off. If this input has no value, + * the aria-label will default to the value of the `label` input. + */ + @Input() labelOff: string | null = null; /** * Event emitted when the state of the icon toggle changes (for example when a user clicks * the icon). */ - @Output() onChange: EventEmitter = new EventEmitter(); - private _onChange: (value: any) => void = (value) => {}; + @Output() readonly onChange: EventEmitter = new EventEmitter(); + private _onChange: (value: any) => void = () => {}; private _onTouched: () => any = () => {}; - private _initialized = false; private _on = false; - private _labelOn: string; - private _labelOff: string; - private _iconOn: string; - private _iconOff: string; - private _iconIsClass: boolean; - private _disabled: boolean; - private toggleAdapter: MdcIconButtonToggleAdapter = { - addClass: (className: string) => this._renderer.addClass(this.iconElm, className), - removeClass: (className: string) => this._renderer.removeClass(this.iconElm, className), - registerInteractionHandler: (type: string, handler: EventListener) => this._registry.listen(this._renderer, type, handler, this._elm), - deregisterInteractionHandler: (type: string, handler: EventListener) => this._registry.unlisten(type, handler), - setText: (text: string) => this.iconElm.textContent = text, - getAttr: (name: string) => { - if (name === 'data-toggle-on-label') return this._labelOn; - else if (name === 'data-toggle-off-label') return this._labelOff; - else if (name === 'data-toggle-on-content') return this.iconIsClass ? null : this._iconOn; - else if (name === 'data-toggle-off-content') return this.iconIsClass ? null : this._iconOff; - else if (name === 'data-toggle-on-class') return this.iconIsClass ? this._iconOn : null; - else if (name === 'data-toggle-off-class') return this.iconIsClass ? this._iconOff : null; - return this._elm.nativeElement.getAttribute(name); - }, + private _disabled = false; + private toggleAdapter: MDCIconButtonToggleAdapter = { + addClass: (className: string) => this._renderer.addClass(this._elm.nativeElement, className), + removeClass: (className: string) => this._renderer.removeClass(this._elm.nativeElement, className), + // TODO return mdc-icon-button__icon--on for on... + hasClass: (className: string) => this._elm.nativeElement.classList.contains(className), setAttr: (name: string, value: string) => this._renderer.setAttribute(this._elm.nativeElement, name, value), - notifyChange: (evtData: {isOn: boolean}) => { + notifyChange: (evtData: MDCIconButtonToggleEventDetail) => { this._on = evtData.isOn; - this.notifyChange(); + this._onChange(this._on); + this.onChange.emit(this._on); } }; - private toggleFoundation: { - init(), - destroy(), - isOn(): boolean, - toggle(isOn?: boolean) - refreshToggleData() - }; + private toggleFoundation: MDCIconButtonToggleFoundation | null = null; - constructor(_elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry) { - super(_elm, rndr, registry); + constructor(_elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, rndr, registry, doc as Document); } ngAfterContentInit() { - this.initRipple(); + this.initRipple(true); this.toggleFoundation = new MDCIconButtonToggleFoundation(this.toggleAdapter); this.toggleFoundation.init(); - // the foundation doesn't initialize the iconOn/iconOff and labelOn/labelOff until - // toggle is called for the first time, - // also, this will ensure 'aria-pressed' and 'aria-label' attributes are initialized: - this.toggleFoundation.toggle(this._on); - this._initialized = true; } ngOnDestroy() { this.destroyRipple(); - this.toggleFoundation.destroy(); - } - - private refreshToggleData() { - if (this._initialized) { - this.toggleFoundation.refreshToggleData(); - // refreshToggleData does not actually apply the new config to the icon: - this.toggleFoundation.toggle(this._on); - } - } - - private get iconElm() { - return this._innerIcon ? this._innerIcon.nativeElement : this._elm.nativeElement; - } - - private notifyChange() { - this._onChange(this._on); - this.onChange.emit(this._on); + this.toggleFoundation?.destroy(); + this.toggleFoundation = null; } - /** @docs-private */ + /** @internal */ writeValue(obj: any) { - let old = this._on; - this._on = !!obj; - if (this._initialized) - this.toggleFoundation.toggle(this._on); + this.on = !!obj; } - /** @docs-private */ + /** @internal */ registerOnChange(onChange: (value: any) => void) { this._onChange = onChange; } - /** @docs-private */ + /** @internal */ registerOnTouched(onTouched: () => any) { this._onTouched = onTouched; } - /** @docs-private */ + /** @internal */ setDisabledState(disabled: boolean) { this._disabled = disabled; } - /** @docs-private */ - protected isRippleUnbounded() { - return true; - } - /** * The current state of the icon (true for on/pressed, false for off/unpressed). */ @Input() get on() { - return this._on; - } - - set on(value: any) { - let newValue = asBoolean(value); - if (newValue !== this._on) { - this._on = newValue; - if (this._initialized) - this.toggleFoundation.toggle(this._on); - } - } - - /** - * The aria-label to use for the on/pressed state of the icon. - */ - @Input() get labelOn() { - return this._labelOn; + return this.toggleFoundation ? this.toggleFoundation.isOn() : this._on; } - set labelOn(value: string) { - this._labelOn = value; - this.refreshToggleData(); - } - - /** - * The aria-label to use for the off/unpressed state of the icon. - */ - @Input() get labelOff() { - return this._labelOff; - } - - set labelOff(value: string) { - this._labelOff = value; - this.refreshToggleData(); - } - - /** - * The icon to use for the on/pressed state of the icon. - */ - @Input() get iconOn() { - return this._iconOn; - } - - set iconOn(value: string) { - if (value !== this._iconOn) { - if (this.iconIsClass) - // the adapter doesn't clean up old classes; this class may be set, - // in which case after it's changed the foundation won't be able to remove it anymore: - this.toggleAdapter.removeClass(this._iconOn); - this._iconOn = value; - this.refreshToggleData(); - } - } - - /** - * The icon to use for the off/unpressed state of the icon. - */ - @Input() get iconOff() { - return this._iconOff; + set on(value: boolean) { + const old = this.toggleFoundation ? this.toggleFoundation.isOn() : this._on; + this._on = asBoolean(value); + if (this.toggleFoundation) + this.toggleFoundation.toggle(this._on); + if (this._on !== old) + this.onChange.emit(this._on); } - set iconOff(value: string) { - if (value !== this._iconOff) { - if (this.iconIsClass) - // the adapter doesn't clean up old classes; this class may be set, - // in which case after it's changed the foundation won't be able to remove it anymore: - this.toggleAdapter.removeClass(this._iconOff); - this._iconOff = value; - this.refreshToggleData(); - } - } + static ngAcceptInputType_on: boolean | ''; - /** - * Some icon fonts (such as Font Awesome) use CSS class names to select the icon to show. - * Others, such as the Material Design Icons from Google use ligatures (allowing selection of - * the icon by using their textual name). When iconIsClass is true, the directive - * assumes iconOn, and iconOff represent class names. When - * iconIsClass is false, the directive assumes the use of ligatures. - * When iconIsClass is not set, the value depends on the availability of a nested - * mdcIconButtonIcon directive: when that exists, iconOn and iconOff - * are expected to be classnames, otherwise they are expected to be ligatures. This is usually - * the intended behaviour, so in most cases you don't need to initialize the iconIsClass - * property. - */ - @Input() get iconIsClass() { - return this._iconIsClass == null ? this._innerIcon != null : this._iconIsClass; + /** @internal */ + @HostBinding('attr.aria-label') get _label() { + return this._on ? (this.labelOn || this.label) : (this.labelOff || this.label); } - - set iconIsClass(value: any) { - let newValue = asBooleanOrNull(value); - if (this._initialized && this._iconIsClass !== newValue) - throw new Error('iconIsClass property should not be changed after the mdcIconButton is initialized'); - this._iconIsClass = newValue; + + /** @internal */ + @HostListener('click') _onClick() { + this.toggleFoundation?.handleClick(); } - @HostListener('(blur') _onBlur() { + /** @internal */ + @HostListener('blur') _onBlur() { this._onTouched(); } @@ -317,24 +197,26 @@ export class MdcIconButtonToggleDirective extends AbstractMdcIcon implements Aft return this._disabled; } - set disabled(value: any) { + set disabled(value: boolean) { this._disabled = asBoolean(value); } + + static ngAcceptInputType_disabled: boolean | ''; } /** * Directive for adding Angular Forms (ControlValueAccessor) behavior to an - * MdcIconButtonDirective. Allows the use of the Angular Forms API with + * MdcIconToggleDirective. Allows the use of the Angular Forms API with * icon toggle buttons, e.g. binding to [(ngModel)], form validation, etc. */ @Directive({ - selector: '[mdcIconButton][iconOn][formControlName],[mdcIconButton][iconOn][formControl],[mdcIconButton][iconOn][ngModel]', + selector: '[mdcIconToggle][formControlName],[mdcIconToggle][formControl],[mdcIconToggle][ngModel]', providers: [ {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsIconButtonDirective), multi: true} ] }) export class MdcFormsIconButtonDirective implements ControlValueAccessor { - constructor(@Self() private mdcIconButton: MdcIconButtonToggleDirective) { + constructor(@Self() private mdcIconButton: MdcIconToggleDirective) { } /** @docs-private */ @@ -359,5 +241,5 @@ export class MdcFormsIconButtonDirective implements ControlValueAccessor { } export const ICON_BUTTON_DIRECTIVES = [ - MdcIconButtonIconDirective, MdcIconButtonDirective, MdcIconButtonToggleDirective, MdcFormsIconButtonDirective + MdcIconDirective, MdcIconButtonDirective, MdcIconToggleDirective, MdcFormsIconButtonDirective ]; diff --git a/bundle/src/components/icon-toggle/mdc.icon-toggle.adapter.ts b/bundle/src/components/icon-toggle/mdc.icon-toggle.adapter.ts deleted file mode 100644 index 46ac03b..0000000 --- a/bundle/src/components/icon-toggle/mdc.icon-toggle.adapter.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** @docs-private */ -export interface MdcIconToggleAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - registerInteractionHandler: (type: string, handler: EventListener) => void; - deregisterInteractionHandler: (type: string, handler: EventListener) => void; - setText: (text: string) => void; - getTabIndex: () => number; - setTabIndex: (tabIndex: number) => void; - getAttr: (name: string) => string; - setAttr: (name: string, value: string) => void; - rmAttr: (name: string) => void; - notifyChange: (evtData: { isOn: boolean }) => void; -} \ No newline at end of file diff --git a/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.spec.ts b/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.spec.ts deleted file mode 100644 index 8e3eea1..0000000 --- a/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.spec.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { Component } from '@angular/core'; -import { MdcIconToggleDirective, MdcIconToggleIconDirective } from './mdc.icon-toggle.directive'; -import { booleanAttributeStyleTest, hasRipple } from '../../testutils/page.test'; - -describe('MdcIconToggleDirective standalone', () => { - @Component({ - template: ` - - ` - }) - class TestComponent { - disabled: any; - favorite: any; - action() {} - } - - function setup() { - const fixture = TestBed.configureTestingModule({ - declarations: [MdcIconToggleDirective, MdcIconToggleIconDirective, TestComponent] - }).createComponent(TestComponent); - fixture.detectChanges(); - return { fixture }; - } - - it('should render the icon toggles with icon and ripple styles', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.nativeElement.querySelector('i'); - expect(iconToggle.classList).toContain('mdc-icon-toggle'); - expect(hasRipple(iconToggle)).toBe(true); - })); - - it('should read behavioral properties from inputs', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); - expect(iconToggle.iconIsClass).toBeFalsy(); - expect(iconToggle.labelOn).toBe('Remove from favorites'); - expect(iconToggle.labelOff).toBe('Add to favorites'); - expect(iconToggle.iconOn).toBe('favorite'); - expect(iconToggle.iconOff).toBe('favorite_border'); - expect(iconToggle.disabled).toBeFalsy(); - })); - - it('should change appearance when behavioral properties are changed', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); - - iconToggle.labelOn = 'Do not like'; - iconToggle.labelOff = 'Like'; - iconToggle.iconOn = 'thumb_up'; - iconToggle.iconOff = 'thumb_down'; - - fixture.detectChanges(); - tick(); - - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Like'); - expect(iconToggle._elm.nativeElement.textContent).toBe('thumb_down'); - })); - - it('should toggle state when clicked', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); - const testComponent = fixture.debugElement.injector.get(TestComponent); - - expect(iconToggle.on).toBe(false); // initial value from 'favorite' property - expect(testComponent.favorite).toBeFalsy(); // not yet initialized, may be undefined or false - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite_border'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Add to favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('false'); - - iconToggle._elm.nativeElement.click(); tick(); fixture.detectChanges(); - - expect(iconToggle.on).toBe(true); - expect(testComponent.favorite).toBe(true); - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Remove from favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('true'); - - iconToggle._elm.nativeElement.click(); tick(); fixture.detectChanges(); - - expect(iconToggle.on).toBe(false); - expect(testComponent.favorite).toBe(false); - expect(iconToggle._elm.nativeElement.textContent).toBe('favorite_border'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Add to favorites'); - expect(iconToggle._elm.nativeElement.getAttribute('aria-pressed')).toBe('false'); - })); -}); - -describe('MdcIconToggleDirective with MdcIconToggleIconDirective', () => { - @Component({ - template: ` - - - - ` - }) - class TestComponent { - disabled: boolean = false; - like: boolean = true; - action() {} - } - - function setup() { - const fixture = TestBed.configureTestingModule({ - declarations: [MdcIconToggleDirective, MdcIconToggleIconDirective, TestComponent] - }).createComponent(TestComponent); - fixture.detectChanges(); - return { fixture }; - } - - it('should render the icon toggles with icon and ripple styles', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.nativeElement.querySelector('span#icon'); - expect(iconToggle.classList).toContain('mdc-icon-toggle'); - expect(hasRipple(iconToggle)).toBe(true); - const icon = iconToggle.querySelector('i.fa'); - expect(icon).toBeDefined(); - expect(icon.classList).toContain('fa-heart'); - expect(icon.classList).toContain('fa'); - })); - - it('should change appearance when behavioral properties are changed', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); - const icon = fixture.nativeElement.querySelector('i.fa'); - expect(icon.classList).toContain('fa-heart'); - - iconToggle.labelOn = 'Open envelope'; - iconToggle.labelOff = 'Close envelope'; - iconToggle.iconOn = 'fa-envelope'; - iconToggle.iconOff = 'fa-envelope-open-o'; - - fixture.detectChanges(); - tick(); - - expect(iconToggle._elm.nativeElement.getAttribute('aria-label')).toBe('Open envelope'); - expect(icon.classList.contains('fa-heart')).toBe(false, 'actual classes: ' + icon.classList); - expect(icon.classList).toContain('fa-envelope'); - expect(icon.classList).toContain('fa'); - })); - - it('should toggle state when clicked', fakeAsync(() => { - const { fixture } = setup(); - const iconToggle = fixture.debugElement.query(By.directive(MdcIconToggleDirective)).injector.get(MdcIconToggleDirective); - const icon = fixture.nativeElement.querySelector('i.fa'); - - expect(icon.classList.contains('fa-heart')).toBe(true, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(false, icon.classList); - - icon.click(); tick(); fixture.detectChanges(); - - expect(icon.classList.contains('fa-heart')).toBe(false, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(true, icon.classList); - - icon.click(); tick(); fixture.detectChanges(); - - expect(icon.classList.contains('fa-heart')).toBe(true, icon.classList); - expect(icon.classList.contains('fa-heart-o')).toBe(false, icon.classList); - })); -}); diff --git a/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.ts b/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.ts deleted file mode 100644 index c631f70..0000000 --- a/bundle/src/components/icon-toggle/mdc.icon-toggle.directive.ts +++ /dev/null @@ -1,351 +0,0 @@ -import { AfterContentInit, AfterViewInit, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, HostBinding, - HostListener, Input, OnDestroy, OnInit, Output, Provider, Renderer2, Self, ViewChild, - ViewEncapsulation } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { MDCRipple } from '@material/ripple'; -import { MDCIconToggleFoundation } from '@material/icon-toggle'; -import { MdcIconToggleAdapter } from './mdc.icon-toggle.adapter'; -import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; -import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { AbstractMdcIcon } from '../icon-button/abstract.mdc.icon'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -/** - * Directive for an icon nested inside a MdcIconToggleDirective. - * This directive is only needed when the icon font uses CSS pseudo-elements in order - * to provide the icon. This is how Font Awesome, and many other icon font libraries - * provide the icons. - * For icon fonts that don't use pseudo elements (such as the Material Design Icons from Google), - * this directive is not necessary. - */ -@Directive({ - selector: '[mdcIconToggleIcon]' -}) -export class MdcIconToggleIconDirective { -} - -/** - * Directive for creating a Material Design icon toggle button. - * The icon toggle is fully accessible, and works with any icon font. - * When the icon font uses CSS pseudo-elements in order to display the icon, - * embed an MdcIconToggleIconDirective inside this directive for - * the actual icon. (Otherwise the pseudo-elements used for showing the icon - * will interfere with the pseudo-elements this directive uses for showing - * ripple styles). - */ -@Directive({ - selector: '[mdcIconToggle]', - providers: [{provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconToggleDirective) }] -}) -export class MdcIconToggleDirective extends AbstractMdcIcon implements AfterContentInit { - @HostBinding('class.mdc-icon-toggle') _hostClass = true; - @HostBinding('attr.role') _role: string = 'button'; - @ContentChild(MdcIconToggleIconDirective, {read: ElementRef}) _innerIcon: ElementRef; - /** - * Event emitted when the state of the icon changes (for example when a user clicks - * the icon). - */ - @Output() onChange: EventEmitter = new EventEmitter(); - private _onChange: (value: any) => void = (value) => {}; - private _onTouched: () => any = () => {}; - private _beforeInitQueu: Array<() => any> = []; - private _initialized = false; - private _labelOn: string; - private _labelOff: string; - private _iconOn: string; - private _iconOff: string; - private _iconIsClass: boolean; - private mdcAdapter: MdcIconToggleAdapter = { - addClass: (className: string) => { - let inner = this._innerIcon && this._iconIsClass !== false && (className === this._iconOn || className === this._iconOff); - this.renderer.addClass(inner ? this._innerIcon.nativeElement : this._elm.nativeElement, className); - }, - removeClass: (className: string) => { - let inner = this._innerIcon && this._iconIsClass !== false && (className === this._iconOn || className === this._iconOff); - this.renderer.removeClass(inner ? this._innerIcon.nativeElement : this._elm.nativeElement, className); - }, - registerInteractionHandler: (type: string, handler: EventListener) => { - this.registry.listen(this.renderer, type, handler, this._elm); - }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { - this.registry.unlisten(type, handler); - }, - setText: (text: string) => { - if (this._innerIcon) - this._innerIcon.nativeElement.textContent = text; - else - this._elm.nativeElement.textContent = text; - }, - getTabIndex: () => this._elm.nativeElement.tabIndex, - setTabIndex: (tabIndex: number) => { this._elm.nativeElement.tabIndex = tabIndex; }, - getAttr: (name: string) => this._elm.nativeElement.getAttribute(name), - setAttr: (name: string, value: string) => { this.renderer.setAttribute(this._elm.nativeElement, name, value); }, - rmAttr: (name: string) => { this.renderer.removeAttribute(this._elm.nativeElement, name); }, - notifyChange: (evtData: {isOn: boolean}) => { - this._onChange(evtData.isOn); - this.onChange.emit(evtData.isOn); - } - }; - private foundation: { - init(), - destroy(), - setDisabled(disabled: boolean), - isDisabled(): boolean, - isOn(): boolean, - toggle(isOn?: boolean) - refreshToggleData(), - isKeyboardActivated(): boolean - } = new MDCIconToggleFoundation(this.mdcAdapter); - - constructor(_elm: ElementRef, private renderer: Renderer2, private registry: MdcEventRegistry) { - super(_elm, renderer, registry); - } - - ngAfterContentInit() { - this.initDefaultAttributes(); - this.initializeData(); - this.foundation.init(); - // run all deferred foundation interactions: - for (let fun of this._beforeInitQueu) - fun(); - this._beforeInitQueu = []; - // the foundation doesn't initialize the iconOn/iconOff and labelOn/labelOff until - // toggle is called for the first time, - // also, this will ensure 'aria-pressed' and 'aria-label' attributes are initialized: - this.foundation.toggle(this.foundation.isOn()); - this.initRipple(); - this._initialized = true; - } - - ngOnDestroy() { - this.destroyRipple(); - this.foundation.destroy(); - } - - private execAfterInit(fun: () => any) { - if (this._initialized) - fun(); - else - this._beforeInitQueu.push(fun); - } - - private refreshData() { - if (this._initialized) { - this.initializeData(); - this.foundation.refreshToggleData(); - // refreshToggleData does not actually apply the new config to the icon: - this.foundation.toggle(this.foundation.isOn()); - } - } - - private initDefaultAttributes() { - if (!this._elm.nativeElement.hasAttribute('tabindex')) - // unless overridden by another tabIndex, we want icon-toggles to - // participate in tabbing (the foundation will remove the tabIndex - // when the icon-toggle is disabled): - this._elm.nativeElement.tabIndex = 0; - } - - private initializeData() { - // iconOn/iconOff are classes when the iconIsClass is true, or when iconIsClass is not set, - // and _innerIcon is used (because _innerIcon is specifically for cases where icons are set via pseudo elements - // by using classes): - let iconIsClass = this.renderIconAsClass; - this.renderer.setAttribute(this._elm.nativeElement, 'data-toggle-on', - this.createDataAttrForToggle(this._labelOn, this._iconOn, iconIsClass)); - this.renderer.setAttribute(this._elm.nativeElement, 'data-toggle-off', - this.createDataAttrForToggle(this._labelOff, this._iconOff, iconIsClass)); - } - - private get renderIconAsClass() { - return this._iconIsClass == null ? this._innerIcon != null : this._iconIsClass; - } - - private createDataAttrForToggle(label: string, icon: string, iconIsClass: boolean) { - let data = { - label: label - }; - data[iconIsClass ? 'cssClass' : 'content'] = icon; - return JSON.stringify(data); - } - - /** @docs-private */ - writeValue(obj: any) { - this.execAfterInit(() => this.foundation.toggle(!!obj)); - } - - /** @docs-private */ - registerOnChange(onChange: (value: any) => void) { - this._onChange = onChange; - } - - /** @docs-private */ - registerOnTouched(onTouched: () => any) { - this._onTouched = onTouched; - } - - /** @docs-private */ - setDisabledState(disabled: boolean) { - this.disabled = disabled; - } - - /** @docs-private */ - protected isRippleUnbounded() { - return true; - } - - /** @docs-private */ - protected isRippleSurfaceActive() { - return this.foundation.isKeyboardActivated(); - } - - /** - * The current state of the icon (true for on/pressed, false for off/unpressed). - */ - @Input() get on() { - return this.foundation.isOn(); - } - - set on(value: any) { - this.execAfterInit(() => this.foundation.toggle(asBoolean(value))); - } - - /** - * The aria-label to use for the on/pressed state of the icon. - */ - @Input() get labelOn() { - return this._labelOn; - } - - set labelOn(value: string) { - this._labelOn = value; - this.refreshData(); - } - - /** - * The aria-label to use for the off/unpressed state of the icon. - */ - @Input() get labelOff() { - return this._labelOff; - } - - set labelOff(value: string) { - this._labelOff = value; - this.refreshData(); - } - - /** - * The icon to use for the on/pressed state of the icon. - */ - @Input() get iconOn() { - return this._iconOn; - } - - set iconOn(value: string) { - if (value !== this._iconOn) { - if (this.renderIconAsClass) - // the adapter doesn't clean up old classes; this class may be set, - // in which case after it's changed the foundation won't be able to remove it anymore: - this.mdcAdapter.removeClass(this._iconOn); - this._iconOn = value; - this.refreshData(); - } - } - - /** - * The icon to use for the off/unpressed state of the icon. - */ - @Input() get iconOff() { - return this._iconOff; - } - - set iconOff(value: string) { - if (value !== this._iconOff) { - if (this.renderIconAsClass) - // the adapter doesn't clean up old classes; this class may be set, - // in which case after it's changed the foundation won't be able to remove it anymore: - this.mdcAdapter.removeClass(this._iconOff); - this._iconOff = value; - this.refreshData(); - } - } - - /** - * Some icon fonts (such as Font Awesome) use CSS class names to select the icon to show. - * Others, such as the Material Design Icons from Google use ligatures (allowing selection of - * the icon by using their textual name). When iconIsClass is true, the directive - * assumes iconOn, and iconOff represent class names. When - * iconIsClass is false, the directive assumes the use of ligatures. - * - * When iconIsClass is not assigned, the directive bases its decision on whether - * or not an embedded MdcIconToggleIconDirective is used. - * In most cases you won't need to set this input, as the default based on an embedded - * MdcIconToggleIconDirective is typically what you need. - */ - @Input() get iconIsClass() { - return this._iconIsClass; - } - - set iconIsClass(value: any) { - this._iconIsClass = asBooleanOrNull(value); - this.refreshData(); - } - - /** - * To disable the icon toggle, set this input to true. - */ - @Input() get disabled() { - return this.foundation.isDisabled(); - } - - set disabled(value: any) { - this.execAfterInit(() => { - let newValue = asBoolean(value); - // we only set the disabled state if it changes from the current value. - // if we don't do that, then calling setDisabled(false) after initialization - // will clear the tabIndex. So this works around a bug in @material/icon-toggle: - if (this.foundation.isDisabled() != newValue) - this.foundation.setDisabled(asBoolean(value)); - }); - } - - @HostListener('(blur') _onBlur() { - this._onTouched(); - } -} - -/** - * Directive for adding Angular Forms (ControlValueAccessor) behavior to an - * MdcIconToggleDirective. Allows the use of the Angular Forms API with - * icon toggles, e.g. binding to [(ngModel)], form validation, etc. - */ -@Directive({ - selector: '[mdcIconToggle][formControlName],[mdcIconToggle][formControl],[mdcIconToggle][ngModel]', - providers: [ - {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsIconToggleDirective), multi: true} - ] -}) -export class MdcFormsIconToggleDirective implements ControlValueAccessor { - constructor(@Self() private mdcIconToggle: MdcIconToggleDirective) { - } - - /** @docs-private */ - writeValue(obj: any) { - this.mdcIconToggle.writeValue(obj); - } - - /** @docs-private */ - registerOnChange(onChange: (value: any) => void) { - this.mdcIconToggle.registerOnChange(onChange); - } - - /** @docs-private */ - registerOnTouched(onTouched: () => any) { - this.mdcIconToggle.registerOnTouched(onTouched); - } - - /** @docs-private */ - setDisabledState(disabled: boolean) { - this.mdcIconToggle.setDisabledState(disabled); - } -} diff --git a/bundle/src/components/line-ripple/mdc.line-ripple.adapter.ts b/bundle/src/components/line-ripple/mdc.line-ripple.adapter.ts deleted file mode 100644 index 27e632b..0000000 --- a/bundle/src/components/line-ripple/mdc.line-ripple.adapter.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MDCLineRippleFoundation } from '@material/line-ripple'; - -/** @docs-private */ -export interface MdcLineRippleAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - hasClass: (className) => boolean, - setStyle: (name: string, value: string) => void, - registerEventHandler: (evtType: string, handler: EventListener) => void, - deregisterEventHandler: (evtType: string, handler: EventListener) => void -} \ No newline at end of file diff --git a/bundle/src/components/linear-progress/mdc.linear-progress.adapter.ts b/bundle/src/components/linear-progress/mdc.linear-progress.adapter.ts deleted file mode 100644 index 76ae67d..0000000 --- a/bundle/src/components/linear-progress/mdc.linear-progress.adapter.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** @docs-private */ -export interface MdcLinearProgressAdapter { - addClass: (className: string) => void; - getPrimaryBar: () => Element; - getBuffer: () => Element; - hasClass: (className: string) => boolean; - removeClass: (className: string) => void; - setStyle: (el: Element, styleProperty: string, value: number) => void; -} \ No newline at end of file diff --git a/bundle/src/components/linear-progress/mdc.linear-progress.directive.spec.ts b/bundle/src/components/linear-progress/mdc.linear-progress.directive.spec.ts new file mode 100644 index 0000000..e6711d2 --- /dev/null +++ b/bundle/src/components/linear-progress/mdc.linear-progress.directive.spec.ts @@ -0,0 +1,119 @@ +import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { MdcLinearProgressDirective } from './mdc.linear-progress.directive'; + +describe('mdcLinearProgress', () => { + @Component({ + template: ` +
+ ` + }) + class TestComponent { + progress = 0; + buffer = 0; + closed = false; + indeterminate = false; + reversed = false; + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcLinearProgressDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); tick(); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const linearProgress = fixture.debugElement.query(By.directive(MdcLinearProgressDirective)).injector.get(MdcLinearProgressDirective); + const element = fixture.nativeElement.querySelector('.mdc-linear-progress'); + return { fixture, linearProgress, element, testComponent }; + } + + it('should render with default values, styles, and attributes', fakeAsync(() => { + const { element } = setup(); + expect(element).toBeDefined(); + expect(element.classList).not.toContain('mdc-linear-progress--indeterminate'); + expect(element.getAttribute('role')).toBe('progressbar'); + expect(element.getAttribute('aria-valuemin')).toBe('0'); + expect(element.getAttribute('aria-valuemax')).toBe('1'); + expect(element.getAttribute('aria-valuenow')).toBe('0'); + expect(element.getAttribute('aria-label')).toBe('My Progress'); + })); + + it('should show buffer and progress changes', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + const primaryBar = fixture.nativeElement.querySelector('.mdc-linear-progress__primary-bar'); + const buffer = fixture.nativeElement.querySelector('.mdc-linear-progress__buffer'); + + expect(element.getAttribute('aria-valuenow')).toBe('0'); + expect(primaryBar.style.transform).toBe('scaleX(0)'); + expect(buffer.style.transform).toBe('scaleX(0)'); + testComponent.progress = 0.2; + testComponent.buffer = 0.9; + fixture.detectChanges(); tick(); + expect(element.getAttribute('aria-valuenow')).toBe('0.2'); + expect(primaryBar.style.transform).toBe('scaleX(0.2)'); + expect(buffer.style.transform).toBe('scaleX(0.9)'); + })); + + it('can be shown reversed', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + + expect(element.classList).not.toContain('mdc-linear-progress--reversed'); + testComponent.progress = 0.3; + testComponent.buffer = 0.6; + testComponent.reversed = true; + fixture.detectChanges(); tick(); + expect(element.classList).toContain('mdc-linear-progress--reversed'); + expect(element.getAttribute('aria-valuenow')).toBe('0.3'); + + testComponent.reversed = false; + fixture.detectChanges(); tick(); + expect(element.classList).not.toContain('mdc-linear-progress--reversed'); + })); + + it('can be indeterminate', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + const primaryBar = fixture.nativeElement.querySelector('.mdc-linear-progress__primary-bar'); + const buffer = fixture.nativeElement.querySelector('.mdc-linear-progress__buffer'); + + expect(element.classList).not.toContain('mdc-linear-progress--indeterminate'); + testComponent.progress = 0.3; + testComponent.buffer = 0.6; + testComponent.indeterminate = true; + fixture.detectChanges(); tick(); + expect(element.classList).toContain('mdc-linear-progress--indeterminate'); + expect(element.getAttribute('aria-valuenow')).toBeNull(); + expect(primaryBar.style.transform).toBe('scaleX(1)'); + expect(buffer.style.transform).toBe('scaleX(1)'); + + testComponent.indeterminate = false; + fixture.detectChanges(); tick(); + expect(element.classList).not.toContain('mdc-linear-progress--indeterminate'); + expect(element.getAttribute('aria-valuenow')).toBe('0.3'); + expect(primaryBar.style.transform).toBe('scaleX(0.3)'); + expect(buffer.style.transform).toBe('scaleX(0.6)'); + })); + + it('can be closed', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + const primaryBar = fixture.nativeElement.querySelector('.mdc-linear-progress__primary-bar'); + const buffer = fixture.nativeElement.querySelector('.mdc-linear-progress__buffer'); + + expect(element.classList).not.toContain('mdc-linear-progress--indeterminate'); + testComponent.progress = 0.3; + testComponent.buffer = 0.6; + testComponent.closed = true; + fixture.detectChanges(); tick(); + expect(element.classList).toContain('mdc-linear-progress--closed'); + expect(element.getAttribute('aria-valuenow')).toBe('0.3'); + expect(primaryBar.style.transform).toBe('scaleX(0.3)'); + expect(buffer.style.transform).toBe('scaleX(0.6)'); + // TODO-UPSTREAM: shouldn't this be aria-hidden? + + testComponent.closed = false; + fixture.detectChanges(); tick(); + expect(element.classList).not.toContain('mdc-linear-progress--closed'); + expect(element.getAttribute('aria-valuenow')).toBe('0.3'); + })); +}); diff --git a/bundle/src/components/linear-progress/mdc.linear-progress.directive.ts b/bundle/src/components/linear-progress/mdc.linear-progress.directive.ts index 38eea68..bea7d5d 100644 --- a/bundle/src/components/linear-progress/mdc.linear-progress.directive.ts +++ b/bundle/src/components/linear-progress/mdc.linear-progress.directive.ts @@ -1,23 +1,10 @@ import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2 } from '@angular/core'; -import { MDCLinearProgressFoundation, strings } from '@material/linear-progress'; -import { MdcLinearProgressAdapter } from './mdc.linear-progress.adapter'; +import { MDCLinearProgressFoundation, MDCLinearProgressAdapter } from '@material/linear-progress'; import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; const CLASS_INDETERMINATE = 'mdc-linear-progress--indeterminate'; const CLASS_REVERSED = 'mdc-linear-progress--reversed'; -interface MdcLinearProgressFoundationInterface { - init(); - destroy(); - setDeterminate(isDeterminate: boolean); - setProgress(value: number); - setBuffer(value: number); - setReverse(isReversed: boolean); - open(); - close(); -} - /** * Directive for creating a Material Design linear progress indicator. * The current implementation will add and manage all DOM child elements that @@ -29,18 +16,30 @@ interface MdcLinearProgressFoundationInterface { selector: '[mdcLinearProgress]' }) export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-linear-progress') _cls = true; + /** @internal */ + @HostBinding('class.mdc-linear-progress') readonly _cls = true; + /** @internal */ @HostBinding('attr.role') _role: string = 'progressbar'; - private _initialized = false; + /** @internal */ + @HostBinding('attr.aria-valuemin') _min = 0; + /** @internal */ + @HostBinding('attr.aria-valuemax') _max = 1; + /** @internal */ @HostBinding('class.' + CLASS_INDETERMINATE) _indeterminate = false; + /** @internal */ @HostBinding('class.' + CLASS_REVERSED) _reverse = false; private _progress = 0; private _buffer = 1; private _closed = false; - private _elmBuffer: HTMLElement; - private _elmPrimaryBar: HTMLElement; + private _elmBuffer: HTMLElement | null = null; + private _elmPrimaryBar: HTMLElement | null = null; + /** + * Label indicationg how the progress bar should be announced to the user. + * Determines the ària-label` attribute value. + */ + @HostBinding('attr.aria-label') @Input() label: string | null = null; - private mdcAdapter: MdcLinearProgressAdapter = { + private mdcAdapter: MDCLinearProgressAdapter = { addClass: (className: string) => { if (className !== CLASS_INDETERMINATE && className != CLASS_REVERSED) this._rndr.addClass(this._root.nativeElement, className); @@ -58,19 +57,22 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { if (className !== CLASS_INDETERMINATE && className != CLASS_REVERSED) this._rndr.removeClass(this._root.nativeElement, className); }, - setStyle: (el: Element, styleProperty: string, value: number) => { + setStyle: (el, styleProperty, value) => { this._rndr.setStyle(el, styleProperty, value); - } + }, + forceLayout: () => this._root.nativeElement.offsetWidth, + removeAttribute: (name) => this._rndr.removeAttribute(this._root.nativeElement, name), + setAttribute: (name, value) => this._rndr.setAttribute(this._root.nativeElement, name, value) }; - private foundation: MdcLinearProgressFoundationInterface = new MDCLinearProgressFoundation(this.mdcAdapter); + private foundation: MDCLinearProgressFoundation | null = null; - constructor(private _rndr: Renderer2, private _root: ElementRef, private _registry: MdcEventRegistry) { + constructor(private _rndr: Renderer2, private _root: ElementRef) { } ngAfterContentInit() { this.initElements(); + this.foundation = new MDCLinearProgressFoundation(this.mdcAdapter); this.foundation.init(); - this._initialized = true; this.foundation.setProgress(this._progress); this.foundation.setBuffer(this._buffer); if (this._closed) @@ -78,16 +80,18 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { } ngOnDestroy() { - this.foundation.destroy(); + this.foundation?.destroy(); + this._elmPrimaryBar = null; + this._elmBuffer = null; } private initElements() { - const elmBufferingDots = this.addElement(this._root.nativeElement, 'div', ['mdc-linear-progress__buffering-dots']); + this.addElement(this._root.nativeElement, 'div', ['mdc-linear-progress__buffering-dots']); this._elmBuffer = this.addElement(this._root.nativeElement, 'div', ['mdc-linear-progress__buffer']); this._elmPrimaryBar = this.addElement(this._root.nativeElement, 'div', ['mdc-linear-progress__bar', 'mdc-linear-progress__primary-bar']); - this.addElement(this._elmPrimaryBar, 'span', ['mdc-linear-progress__bar-inner']); + this.addElement(this._elmPrimaryBar!, 'span', ['mdc-linear-progress__bar-inner']); const secondaryBar = this.addElement(this._root.nativeElement, 'div', ['mdc-linear-progress__bar', 'mdc-linear-progress__secondary-bar']); - this.addElement(this._elmPrimaryBar, 'span', ['mdc-linear-progress__bar-inner']); + this.addElement(secondaryBar, 'span', ['mdc-linear-progress__bar-inner']); } private addElement(parent: HTMLElement, element: string, classNames: string[]) { @@ -103,16 +107,17 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { * Puts the progress indicator in 'indeterminate' state, signaling * that the exact progress on a measured task is not known. */ - @Input() @HostBinding('class.' + CLASS_INDETERMINATE) + @Input() + @HostBinding('class.' + CLASS_INDETERMINATE) get indeterminate() { return this._indeterminate; } - set indeterminate(value: any) { + set indeterminate(value: boolean) { let newValue = asBoolean(value); if (newValue !== this._indeterminate) { this._indeterminate = newValue; - if (this._initialized) { + if (this.foundation) { this.foundation.setDeterminate(!this._indeterminate); if (!this._indeterminate) { this.foundation.setProgress(this._progress); @@ -122,6 +127,8 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { } } + static ngAcceptInputType_indeterminate: boolean | ''; + /** * Reverses the direction of the linear progress indicator. */ @@ -130,12 +137,13 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { return this._reverse; } - set reversed(value: any) { + set reversed(value: boolean) { this._reverse = asBoolean(value); - if (this._initialized) - this.foundation.setReverse(this._reverse); + this.foundation?.setReverse(this._reverse); } + static ngAcceptInputType_reversed: boolean | ''; + /** * Set the progress, the value should be between [0, 1]. */ @@ -144,12 +152,13 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { return this._progress; } - set progressValue(value: number | string) { + set progressValue(value: number) { this._progress = +value; - if (this._initialized) - this.foundation.setProgress(this._progress); + this.foundation?.setProgress(this._progress); } + static ngAcceptInputType_progressValue: number | string; + /** * Set the buffer progress, the value should be between [0, 1]. */ @@ -158,12 +167,13 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { return this._buffer; } - set bufferValue(value: number | string) { + set bufferValue(value: number) { this._buffer = +value; - if (this._initialized) - this.foundation.setBuffer(this._buffer); + this.foundation?.setBuffer(this._buffer); } + static ngAcceptInputType_bufferValue: number | string; + /** * When set to true this closes (animates away) the progress bar, * when set to false this opens (animates into view) the progress bar. @@ -173,16 +183,20 @@ export class MdcLinearProgressDirective implements AfterContentInit, OnDestroy { return this._closed; } - set closed(value: any) { + set closed(value: boolean) { let newValue = asBoolean(value); if (newValue !== this._closed) { this._closed = newValue; - if (this._initialized) { - if (newValue) - this.foundation.close(); - else - this.foundation.open(); - } + if (newValue) + this.foundation?.close(); + else + this.foundation?.open(); } } + + static ngAcceptInputType_closed: boolean | ''; } + +export const LINEAR_PROGRESS_DIRECTIVES = [ + MdcLinearProgressDirective +]; diff --git a/bundle/src/components/list/mdc.list.directive.spec.ts b/bundle/src/components/list/mdc.list.directive.spec.ts new file mode 100644 index 0000000..2bdbf07 --- /dev/null +++ b/bundle/src/components/list/mdc.list.directive.spec.ts @@ -0,0 +1,370 @@ +import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { LIST_DIRECTIVES } from './mdc.list.directive'; +import { hasRipple } from '../../testutils/page.test'; + +// TODO tests for checbox/radio input controlled list items + +describe('mdcList', () => { + @Component({ + template: ` +
    +
  • + {{item}} +
  • +
+ ` + }) + class TestComponent { + actions: number[] = []; + selectedChange: {index: number, value: boolean}[] = []; + items = ['item 1', 'item 2', 'item 3']; + nonInteractive = false; + selectionMode: string = null; + disabled: number = null; + action(i: number) { + this.actions.push(i); + } + active(value: boolean, index: number) { + this.selectedChange.push({index, value}); + } + } + + it('should render the list and items with correct styles and attributes', fakeAsync(() => { + const { list, items } = setup(); + expect(list).toBeDefined(); + expect(list.getAttribute('role')).toBeNull(); + expect(list.getAttribute('tabindex')).toBeNull(); + expect(items.length).toBe(3); + // by default items are set to be focusable, but only the first item is tabbable (tabindex=-1): + expectTabbable(items, 0); + expectRoles(items, null); + expect(items.map(it => it.getAttribute('tabindex'))).toEqual(['0', '-1', '-1']); + items.forEach(item => expect(hasRipple(item)).toBe(true)); + })); + + it('clicking an item affects tabindexes', fakeAsync(() => { + const { fixture, items } = setup(); + + // focus by clicking: + focusItem(fixture, items, 1); + expectTabbable(items, 1); + + // remove focus should restore tabindex=0 on first item: + blurItem(fixture, items, 1); + expectTabbable(items, 0); + })); + + it('keyboard navigation affects tabindexes', fakeAsync(() => { + const { fixture, items } = setup(); + + // tabbing will focus the element with tabindex=0 (default first elm): + items[0].focus(); + items[0].dispatchEvent(newFocusEvent('focusin')); + tick(); fixture.detectChanges(); + expectTabbable(items, 0); // tabindexes on items should not have been changed + // Down key: + items[0].dispatchEvent(newKeydownEvent('ArrowDown')); + tick(); fixture.detectChanges(); + expectTabbable(items, 1); + // focusOut should make first element tabbable again: + blurItem(fixture, items, 1); + expectTabbable(items, 0); + })); + + it('adding items will not change focus', fakeAsync(() => { + const { fixture, items, testComponent } = setup(); + + focusItem(fixture, items, 1); + testComponent.items = ['new text', ...testComponent.items]; + fixture.detectChanges(); tick(); + const currentItems: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-list-item')]; + expect(currentItems.length).toBe(4); + expectTabbable(currentItems, 2); // next item, because one was inserted before + blurItem(fixture, currentItems, 2); + expectTabbable(currentItems, 0); + })); + + it('nonInteractive lists ignore interaction and are not focusable', fakeAsync(() => { + const { fixture, items, testComponent } = setup(); + testComponent.nonInteractive = true; + fixture.detectChanges(); + + expectTabbable(items, -1); // not focusable + focusItem(fixture, items, 1); // will not focus: + expectTabbable(items, -1); // not focusable + // not listening to keyboard input: + items[0].dispatchEvent(newKeydownEvent('ArrowDown')); + tick(); fixture.detectChanges(); + expectTabbable(items, -1); + // no action events have been emitted: + expect(testComponent.actions).toEqual([]); + expect(testComponent.selectedChange).toEqual([]); + })); + + it('disabled items are correctly styled, not actionable, and not selectable', fakeAsync(() => { + const { fixture, items, testComponent } = setup(); + testComponent.disabled = 1; + fixture.detectChanges(); tick(); + expectDisabled(items, 1); + + testComponent.selectionMode = 'single'; + fixture.detectChanges(); tick(); + // try to focus and activate disabled item: + focusItem(fixture, items, 1); + expectTabbable(items, 1); // is focusable + expectActive(items, -1, 'selected'); // can not be activated + // no action events have been emitted: + expect(testComponent.actions).toEqual([]); + expect(testComponent.selectedChange).toEqual([]); + })); + + it('selectionMode=single/current', fakeAsync(() => { + const { fixture, items, testComponent } = setup(); + testComponent.selectionMode = 'single'; + fixture.detectChanges(); tick(); + validateSelectionMode('selected', -1); + testComponent.selectionMode = 'active'; + fixture.detectChanges(); tick(); + testComponent.actions.length = 0; + testComponent.selectedChange.length = 0; + validateSelectionMode('current', 2); + + function validateSelectionMode(type, initialActive) { + expectActive(items, initialActive, type); + + // activate on click: + focusItem(fixture, items, 1); + expectTabbable(items, 1); + expectActive(items, 1, type); + // should also emit action event: + expect(testComponent.actions).toEqual([1]); + if (initialActive !== -1) + expect(testComponent.selectedChange).toEqual([ + {index: initialActive, value: false}, + {index: 1, value: true} + ]); + else + expect(testComponent.selectedChange).toEqual([ + {index: 1, value: true} + ]); + testComponent.selectedChange.length = 0; + + // active on keyboard on input: + items[1].dispatchEvent(newKeydownEvent('ArrowDown')); + tick(); fixture.detectChanges(); + expectTabbable(items, 2); + expectActive(items, 1,type); + items[2].dispatchEvent(newKeydownEvent('Enter')); + tick(); fixture.detectChanges(); + expectActive(items, 2, type); + // should also emit action event: + expect(testComponent.actions).toEqual([1, 2]); + expect(testComponent.selectedChange).toEqual([ + {index: 1, value: false}, + {index: 2, value: true} + ]); + } + })); + + @Component({ + template: ` +
+

Header

+
    +
  • + + + primary + secondary + + +
  • +
  • +
+
+
+ ` + }) + class TestOptionalDirectivesComponent { + inset = null; + padded = null; + } + it('should render optional directives correctly', fakeAsync(() => { + const { fixture, list, testComponent } = setup(TestOptionalDirectivesComponent); + + expect(fixture.nativeElement.querySelector('div.mdc-list-group')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('h3.mdc-list-group__subheader')).not.toBeNull(); + expect(list.classList).toContain('mdc-list--two-line'); + expect(fixture.nativeElement.querySelector('li.mdc-list-item')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('span.mdc-list-item__text')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('span.mdc-list-item__primary-text')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('span.mdc-list-item__secondary-text')).not.toBeNull(); + const itemDivider = fixture.nativeElement.querySelector('li.mdc-list-divider'); + expect(itemDivider.getAttribute('role')).toBe('separator'); + expect(itemDivider.classList).not.toContain('mdc-list-divider--inset'); + expect(itemDivider.classList).not.toContain('mdc-list-divider--padded'); + const listDivider = fixture.nativeElement.querySelector('hr.mdc-list-divider'); + expect(listDivider.getAttribute('role')).toBeNull(); + expect(fixture.nativeElement.querySelector('span.mdc-list-item__graphic')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('span.mdc-list-item__meta')).not.toBeNull(); + + testComponent.inset = true; + testComponent.padded = true; + fixture.detectChanges(); + expect(itemDivider.classList).toContain('mdc-list-divider--inset'); + expect(itemDivider.classList).toContain('mdc-list-divider--padded'); + })); + + @Component({ + template: ` +
    +
  • + {{item.value}} +
  • +
+ ` + }) + class TestProgrammaticActivationComponent { + selectedChange: {value: string, active: boolean}[] = []; + items = [ + {value: 'item1', active: true}, + {value: 'item2', active: false}, + {value: 'item3', active: false} + ]; + nonInteractive = false; + selectionMode: string = null; + active(active: boolean, value: string) { + this.selectedChange.push({value, active}); + } + } + it('single selection list: programmatic change of active/selected items', fakeAsync(() => { + const { fixture, items, testComponent } = setup(TestProgrammaticActivationComponent); + expectActive(items, 0, 'selected', true); // first item selected, no aria-selected, because plain list should not have aria-selected attributes + expect(testComponent.selectedChange).toEqual([{active: true, value: 'item1'}]); + // switch to single selection mode: + testComponent.selectionMode = 'single'; + testComponent.selectedChange = []; + fixture.detectChanges(); tick(); + expectActive(items, 0, 'selected'); + testComponent.items[0].active = false; + testComponent.items[2].active = true; + fixture.detectChanges(); tick(); + expectActive(items, 2, 'selected'); + expect(testComponent.selectedChange).toEqual([ + {active: false, value: 'item1'}, + {active: true, value: 'item3'}, + ]); + + testComponent.selectionMode = 'active'; + fixture.detectChanges(); tick(); + expectActive(items, 2, 'current'); + testComponent.items[1].active = true; + fixture.detectChanges(); tick(); + expectActive(items, 1, 'current'); // only the first of the two 'active' items selected + })); + + it('simple list: programmatic change of active/selected items', fakeAsync(() => { + const { fixture, items, testComponent } = setup(TestProgrammaticActivationComponent); + expectActive(items, 0, 'selected', true); + expect(testComponent.selectedChange).toEqual([{active: true, value: 'item1'}]); + testComponent.selectedChange = []; + // activate all items: + testComponent.items[1].active = true; + testComponent.items[2].active = true; + fixture.detectChanges(); tick(); + expectActive(items, [0, 1, 2], 'selected', true); + expect(testComponent.selectedChange).toEqual([ + {active: true, value: 'item2'}, + {active: true, value: 'item3'}, + ]); + + testComponent.nonInteractive = true; + testComponent.items[0].active = false; + fixture.detectChanges(); tick(); + expectActive(items, [1, 2], 'selected', true); + })); + + function expectTabbable(items: HTMLElement[], index: number) { + const expected = Array.apply(null, Array(items.length)).map((_, i) => i === index ? '0' : '-1'); + expect(items.map(it => it.getAttribute('tabindex'))).toEqual(expected); + } + + function expectRoles(items: HTMLElement[], role: string) { + items.forEach(item => expect(item.getAttribute('role')).toBe(role)); + } + + function expectActive(items: HTMLElement[], index: number | number[], type: 'current' | 'selected' | 'checked' | null, noAria = false) { + const indexes = typeof index === 'number' ? [index] : index; + const expectSelected = Array.apply(null, Array(items.length)).map((_, i) => indexes.indexOf(i) !== -1 && type === 'selected'); + const expectActived = Array.apply(null, Array(items.length)).map((_, i) => indexes.indexOf(i) !== -1 && type === 'current'); + const expectAriaSelected = Array.apply(null, Array(items.length)).map((_, i) => ariaValueForType('selected', i, noAria)); + const expectAriaCurrent = Array.apply(null, Array(items.length)).map((_, i) => ariaValueForType('current', i, noAria)); + const expectAriaChecked = Array.apply(null, Array(items.length)).map((_, i) => ariaValueForType('checked', i, noAria)); + expect(items.map(it => it.classList.contains('mdc-list-item--selected'))).toEqual(expectSelected); + expect(items.map(it => it.classList.contains('mdc-list-item--activated'))).toEqual(expectActived); + expect(items.map(it => it.getAttribute('aria-selected'))).toEqual(expectAriaSelected); + expect(items.map(it => it.getAttribute('aria-current'))).toEqual(expectAriaCurrent); + expect(items.map(it => it.getAttribute('aria-checked'))).toEqual(expectAriaChecked); + + function ariaValueForType(forType: 'current' | 'selected' | 'checked', i, noAria) { + if (!noAria && type === forType) + return indexes.indexOf(i) !== -1 ? 'true' : 'false'; + return null; + } + } + + function expectDisabled(items: HTMLElement[], index: number) { + const expected = Array.apply(null, Array(items.length)).map((_, i) => i === index); + expect(items.map(it => it.classList.contains('mdc-list-item--disabled'))).toEqual(expected); + expect(items.map(it => !!it.getAttribute('aria-disabled'))).toEqual(expected); + expect(items.map(it => it.getAttribute('aria-disabled') === 'true')).toEqual(expected); + } + + function newFocusEvent(name: string) { + const event = document.createEvent('FocusEvent'); + event.initEvent(name, true, true); + return event; + } + + function newKeydownEvent(key: string) { + let event = new KeyboardEvent('keydown', {key}); + event.initEvent('keydown', true, true); + return event; + } + + function newClickEvent() { + let event = document.createEvent('MouseEvent'); + event.initEvent('click', true, true); + return event; + } + + function blurActive() { + (document.activeElement).blur(); + } + + function focusItem(fixture, items: HTMLElement[], index: number) { + items[index].focus(); + items[index].dispatchEvent(newFocusEvent('focusin')); + items[index].dispatchEvent(newClickEvent()); + tick(); fixture.detectChanges(); + } + + function blurItem(fixture, items, focusedIndex) { + blurActive(); + items[focusedIndex].dispatchEvent(newFocusEvent('focusout')); + tick(); fixture.detectChanges(); + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...LIST_DIRECTIVES, compType] + }).createComponent(compType); + fixture.detectChanges(); + const testComponent = fixture.debugElement.injector.get(compType); + const list: HTMLElement = fixture.nativeElement.querySelector('.mdc-list'); + const items: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-list-item')]; + return { fixture, list, items, testComponent }; + } +}); diff --git a/bundle/src/components/list/mdc.list.directive.ts b/bundle/src/components/list/mdc.list.directive.ts index 6ed7c1a..3124f8c 100644 --- a/bundle/src/components/list/mdc.list.directive.ts +++ b/bundle/src/components/list/mdc.list.directive.ts @@ -1,29 +1,38 @@ -import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, - Input, OnDestroy, QueryList, Renderer2 } from '@angular/core'; +import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, Input, OnDestroy, + QueryList, Renderer2, Output, EventEmitter, HostListener, ChangeDetectorRef, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { MDCListFoundation, MDCListAdapter, strings, cssClasses } from '@material/list'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry';; +import { MdcEventRegistry } from '../../utils/mdc.event.registry'; +import { MdcRadioDirective } from '../radio/mdc.radio.directive'; +import { MdcCheckboxDirective } from '../checkbox/mdc.checkbox.directive'; +import { Subject, merge, ReplaySubject } from 'rxjs'; +import { takeUntil, debounceTime } from 'rxjs/operators'; /** - * Directive for a separator in a list (between list items), or as a separator between lists. - * This directive also adds a "role" attribute to its element (depending on the context - * where the divider is used). + * Directive for a separator in a list (between list items), or as a separator in a + * list group (between lists). + * + * # Accessibility + * This directive adds a `role=separator` attribute when it is used as a separator + * between list items. */ @Directive({ - selector: '[mdcListDivider]', + selector: '[mdcListDivider]' }) export class MdcListDividerDirective { - @HostBinding('class.mdc-list-divider') _cls = true; - @HostBinding('attr.role') _role = 'separator'; + /** @internal */ + @HostBinding('class.mdc-list-divider') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role: string | null = 'separator'; + /** @internal */ @HostBinding('attr.disabled') _disabled = false; private _inset = false; private _padded = false; - constructor(private _elm: ElementRef) { - if (_elm.nativeElement.nodeName === 'OPTION') { - this._role = 'presentation'; - this._disabled = true; - } else if (_elm.nativeElement.nodeName === 'HR') + constructor(_elm: ElementRef) { + if (_elm.nativeElement.nodeName.toUpperCase() !== 'LI') this._role = null; } @@ -36,10 +45,12 @@ export class MdcListDividerDirective { return this._inset; } - set inset(val: any) { + set inset(val: boolean) { this._inset = asBoolean(val); } + static ngAcceptInputType_inset: boolean | ''; + /** * When this input is defined and does not have value false, the divider leaves * gaps on each site to match the padding of mdcListItemMeta. @@ -49,34 +60,92 @@ export class MdcListDividerDirective { return this._padded; } - set padded(val: any) { + set padded(val: boolean) { this._padded = asBoolean(val); } + + static ngAcceptInputType_padded: boolean | ''; } /** * Directive for the items of a material list. - * This directive should be used for the direct children of a MdcListDirective. + * This directive should be used for the direct children (list items) of an + * `mdcList`. + * + * # Children + * * Use `mdcListItemText` for the text content of the list. One line and two line + * lists are supported. See `mdcListItemText` for more info. + * * Optional: `mdcListItemGraphic` for a starting detail (typically icon or image). + * * Optional: `mdcListItemMeta` for the end detail (typically icon or image). + * + * # Accessibility + * * All items in a list will get a `tabindex=-1` attribute to make them focusable, + * but not tabbable. The focused, active/current, or first (in that preference) item will + * get `tabindex=0`, so that the list can be tabbed into. Keyboard navigation + * between list items is done with arrow, home, and end keys. Keyboard based selection of + * an item (when items are selectable), can be done with the enter or space key. + * * The `role` attribute with be set to `option` for single selection lists, + * `checkbox` for list items that can be selected with embedded checkbox inputs, `radio` + * for for list items that can be selected with embedded radio inputs, `menuitem` when the + * list is part of an `mdcMenu`. Otherwise there will be no `role` attribute, so the default + * role for a standard list item (`role=listitem`) will apply. + * * Single selection lists set the `aria-selected` or `aria-current` attributes, based on the + * chosen `selectionMode` of the list. Please see [WAI-ARIA aria-current](https://www.w3.org/TR/wai-aria-1.1/#aria-current) + * for recommendations. + * * `aria-checked` will be set for lists with embedded checkbox or radio inputs. + * * Disabled list items will be included in the keyboard navigation. This follows + * [focusability of disabled controls](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_disabled_controls) + * recommendations in the ARIA practices article. Exception: when the list is part of an `mdcMenu` or `mdcSelect`, + * disabled items are not included in the keyboard navigation. + * * As the user navigates through the list, any button and anchor elements within list items that are not focused + * will receive `tabindex=-1`. When the list item receives focus, those elements will receive `tabindex=0`. + * This allows for the user to tab through list item elements and then tab to the first element after the list. + * * Lists are interactive by default (unless `nonInteractive` is set on the `mdcList`). List items will + * show ripples when interacted with. + * * `aria-disabled` will be set for disabled list items. When the list uses checkbox or radio inputs to control + * the checked state, the disabled state will mirror the state of those inputs. */ @Directive({ selector: '[mdcListItem]' }) export class MdcListItemDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-list-item') _cls = true; - @HostBinding('attr.role') public _role = null; + /** @internal */ + @HostBinding('class.mdc-list-item') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') public _role: string | null = null; + /** @internal */ + @ContentChildren(MdcRadioDirective, {descendants: true}) _radios?: QueryList; + /** @internal */ + @ContentChildren(MdcCheckboxDirective, {descendants: true}) _checkBoxes?: QueryList; + /** @internal */ + _ariaActive: 'current' | 'selected' | 'checked' | null = null; private _initialized = false; - private _interactive = false; + private _interactive = true; private _disabled = false; - private _selected = false; - private _activated = false; + private _active = false; + /** @internal (called valueChanged instead of valueChange so that library consumers cannot by accident use + * this for two-way binding) */ + @Output() readonly valueChanged: EventEmitter = new EventEmitter(); + /** @internal */ + _activationRequest: Subject = new ReplaySubject(1); /** - * When a list is used inside an mdcMenu, or mdcSelect, - * this property can be used to assign a value to this choice/selection item. + * Event emitted for user action on the list item, including keyboard and mouse actions. + * This will not emit when the `mdcList` has `nonInteractive` set. */ - @Input() value; + @Output() readonly action: EventEmitter = new EventEmitter(); + /** + * Event emitted when the active state of a list item in a single-selection list + * (`selectionMode` is `single` or `active`) is changed. This event does not emit + * for lists that do not have the mentioned `selectionMode`, and therefore does also + * not emit for lists where the active/selected state is controlled by embedded checkbox + * or radio inputs. (Note that for lists controlled by an `mdcSelect`, the `selectionMode` + * will be either `single` or `active`). + */ + @Output() readonly selectedChange: EventEmitter = new EventEmitter(); + private _value: string | null = null; - constructor(public _elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry) { - super(_elm, rndr, registry) + constructor(public _elm: ElementRef, rndr: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, rndr, registry, doc as Document); } ngAfterContentInit() { @@ -89,6 +158,7 @@ export class MdcListItemDirective extends AbstractMdcRipple implements AfterCont this.destroyRipple(); } + /** @internal */ _setInteractive(interactive: boolean) { if (this._interactive !== interactive) { this._interactive = interactive; @@ -102,178 +172,545 @@ export class MdcListItemDirective extends AbstractMdcRipple implements AfterCont } /** - * When a list is used inside an mdcMenu, or mdcSelect, - * this property can be used to disable the item. When disabled, the list-item will have - * the aria-disabled attribute, and for mdcMenu, - * or mdcSelect will set the tabindex to -1. + * If set to a value other than false, the item will be disabled. This affects styling + * and selectability, and may affect keyboard navigation. + * This input is ignored for lists where the selection is controlled by embedded checkbox + * or radio inputs. In those cases the disabled state of the input will be used instead. */ - @Input() + @HostBinding('class.mdc-list-item--disabled') @Input() get disabled() { + if (this._ariaActive === 'checked') { + const input = this._getInput(); + return input ? input._elm.nativeElement.disabled : false; + } return this._disabled; } - set disabled(val: any) { + set disabled(val: boolean) { this._disabled = asBoolean(val); } + static ngAcceptInputType_disabled: boolean | ''; + /** - * When this value is set to a value other than false, the list item will be - * styled in a selected state. Note: selection and activation are different things. - * Multiple items in a list can be selected, only one can be activated. - * Selection is likely to change soon, activation is more permanent than selection. + * Assign this field with a value that should be reflected in the `value` property of + * a `selectionMode=single|active` or and `mdcMenu` or `mdcSelect` for the active property. + * Ignored for lists that don't offer a selection, and for lists that use checkbox/radio + * inputs for selection. */ - @Input() @HostBinding('class.mdc-list-item--selected') - get selected() { - return this._selected; + @Input() get value() { + return this._value; } - set selected(val: any) { - this._selected = asBoolean(val); + set value(newValue: string | null) { + if (this._value !== newValue) { + this._value = newValue; + this.valueChanged.emit(newValue); + } } /** - * When this value is set to a value other than false, the list item will be - * styled in an activated state. Note: selection and activation are different things. - * Multiple items in a list can be selected, only one can be activated. - * Selection is likely to change soon, activation is more permanent than selection. + * This input can be used to change the active or selected state of the item. This should *not* be used for lists + * inside an `mdcSelect`/`mdcMenu`, or for lists that use checkbox/radio inputs for selection. + * Depending on the `selectionMode` of the list this will update the `selected` or `active` state of the item. */ - @Input() @HostBinding('class.mdc-list-item--activated') - get activated() { - return this._activated; + @Input() set selected(val: boolean) { + let newValue = asBoolean(val); + if (newValue !== this._active) + this._activationRequest.next(val); } - set activated(val: any) { - this._activated = asBoolean(val); + static ngAcceptInputType_selected: boolean | ''; + + /** @internal */ + @HostBinding('class.mdc-list-item--selected') + get _selected() { + return (this._ariaActive === 'selected' && this._active) + || (!this._role && this._active); } - @HostBinding('attr.tabindex') get _tabIndex() { - if (this._role === 'menuitem' || this._role === 'option') - return this._disabled ? -1 : 0; - return null; + /** @internal */ + @HostBinding('class.mdc-list-item--activated') + get _activated() { + return this._ariaActive === 'current' && this._active; } + /** @internal */ @HostBinding('attr.aria-disabled') get _ariaDisabled() { - if (this._disabled) + if (this.disabled) // checks checkbox/radio disabled state when appropriate return 'true'; return null; } + + /** @internal */ + @HostBinding('attr.aria-current') get _ariaCurrent() { + if (this._ariaActive === 'current') + return this._active ? 'true' : 'false'; + return null; + } + + /** @internal */ + @HostBinding('attr.aria-selected') get _ariaSelected() { + if (this._ariaActive === 'selected') + return this._active ? 'true' : 'false'; + return null; + } + + /** @internal */ + @HostBinding('attr.aria-checked') get _ariaChecked() { + if (this._ariaActive === 'checked') + // (this.active: returns checked value of embedded input if appropriate) + return this.active ? 'true' : 'false'; + return null; + } + + /** @internal */ + get active() { + if (this._ariaActive === 'checked') { + const input = this._getInput(); + return input ? input._elm.nativeElement.checked : false; + } + return this._active; + } + + /** @internal */ + set active(value: boolean) { + if (value !== this._active) { + this._active = value; + this.selectedChange.emit(value); + } + } + + /** @internal */ + _getRadio() { + return this._radios?.first; + } + + /** @internal */ + _getCheckbox() { + return this._checkBoxes?.first; + } + + /** @internal */ + _getInput() { + return (this._getCheckbox() || this._getRadio())?._input; + } } /** - * Directive to mark the first line of an item with "two line list" styling - * according to the Material Design spec. - * This directive, if used, should be the child of an MdcListItemDirective. - * Using this directive inside any mdcListItem will put the list - * "two line" mode. + * Directive to mark the text portion(s) of an `mdcListItem`. This directive should be the child of an `mdcListItem`. + * For single line lists, the text can be added directly to this directive. + * For two line lists, add `mdcListItemPrimaryText` and `mdcListItemSecondaryText` children. */ @Directive({ selector: '[mdcListItemText]' }) export class MdcListItemTextDirective { - @HostBinding('class.mdc-list-item__text') _cls = true; + /** @internal */ + @HostBinding('class.mdc-list-item__text') readonly _cls = true; +} - constructor() {} +/** + * Directive to mark the first line of an item with "two line list" styling. + * This directive, if used, should be the child of an `mdcListItemText`. + * Using this directive will put the list "two line" mode. + */ +@Directive({ + selector: '[mdcListItemPrimaryText]' +}) +export class MdcListItemPrimaryTextDirective { + /** @internal */ + @HostBinding('class.mdc-list-item__primary-text') readonly _cls = true; } /** * Directive for the secondary text of an item with "two line list" styling. + * This directive, if used, should be the child of an `mdcListItemText`, and + * come after the `mdcListItemPrimaryText`. */ @Directive({ selector: '[mdcListItemSecondaryText]', }) export class MdcListItemSecondaryTextDirective { - @HostBinding('class.mdc-list-item__secondary-text') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-list-item__secondary-text') readonly _cls = true; } /** * Directive for the start detail item of a list item. - * This directive, if used, should be the child of an MdcListItemDirective. + * This directive, if used, should be the child of an`mdcListItem`. */ @Directive({ selector: '[mdcListItemGraphic]', }) export class MdcListItemGraphicDirective { - @HostBinding('class.mdc-list-item__graphic') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-list-item__graphic') readonly _cls = true; } /** * Directive for the end detail item of a list item. - * This directive, if used, should be the child of an MdcListItemDirective. + * This directive, if used, should be the child of an `mdcListItem`. */ @Directive({ selector: '[mdcListItemMeta]', }) export class MdcListItemMetaDirective { - @HostBinding('class.mdc-list-item__meta') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-list-item__meta') readonly _cls = true; } +/** @docs-private */ export enum MdcListFunction { - plain, menu + plain, menu, select }; +// attributes on list-items that we maintain ourselves, so should be ignored +// in the adapter: +const ANGULAR_ITEM_ATTRIBUTES = [ + strings.ARIA_CHECKED, strings.ARIA_SELECTED, strings.ARIA_CURRENT, strings.ARIA_DISABLED +]; +// classes on list-items that we maintain ourselves, so should be ignored +// in the adapter: +const ANGULAR_ITEM_CLASSES = [ + cssClasses.LIST_ITEM_DISABLED_CLASS, cssClasses.LIST_ITEM_ACTIVATED_CLASS, cssClasses.LIST_ITEM_SELECTED_CLASS +]; + /** - * Directive for a material list. - * The children of this directive should either be MdcListItemDirective, - * or MdcListDividerDirective elements. - * This directive can optionally be contained in a MdcListGroupDirective, in a - * MdcMenuDirective, or in a MdcSelectDirective. + * Lists are continuous, vertical indexes of text or images. They can be interactive, and may support + * selaction/activation of list of items. Single-line and Two-line lists are supported, as well as + * starting and end details (images or controls) on a list. A list contains `mdcListItem` children, + * and may also contain `mdcListDivider` children. + * + * A list can be used by itself, or contained inside `mdcListGroup`, `mdcMenu`, or `mdcSelect`. + * + * # Accessibility + * * See Accessibility section of `mdcListItem` for navigation, focus, and tab(index) affordances. + * * The `role` attribute will be set to `listbox` for single selection lists (`selectionMode` is `single` + * or `active`), to `radiogroup` when selection is triggered by embedded radio inputs, to + * `checkbox` when selection is triggered by embedded checkbox inputs, to `menu` when used inside + * `mdcMenu`. Otherwise there will be no `role` attribute, so the default role for a standard list + * (`role=list`) will apply. + * * You should set an appropriate `label` for checkbox based selection lists. The + * `label` will be reflected to the `aria-label` attribute. */ @Directive({ selector: '[mdcList]', }) -export class MdcListDirective implements AfterContentInit { - @HostBinding('class.mdc-list') _cls = true; - @ContentChildren(MdcListItemDirective) _items: QueryList; - @ContentChildren(MdcListItemTextDirective, {descendants: true}) _texts: QueryList; +export class MdcListDirective implements AfterContentInit, OnDestroy { + private onDestroy$: Subject = new Subject(); + private document: Document; + /** @internal */ + @HostBinding('class.mdc-list') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcListItemDirective) _items?: QueryList; + /** @internal */ + @ContentChildren(MdcListItemPrimaryTextDirective, {descendants: true}) _primaryTexts?: QueryList; + /** @internal */ + @ContentChildren(MdcCheckboxDirective, {descendants: true}) _checkboxes?: QueryList; + /** @internal */ + @ContentChildren(MdcRadioDirective, {descendants: true}) _radios?: QueryList; + /** @internal */ + @Output() readonly itemsChanged: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly itemValuesChanged: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly itemAction: EventEmitter<{index: number, value: string | null}> = new EventEmitter(); + /** @internal */ @HostBinding('class.mdc-list--two-line') _twoLine = false; + /** + * Label announcing the purpose of the list. Should be set for lists that embed checkbox inputs + * for activation/selection. The label is reflected in the `aria-label` attribute value. + * + * @internal + */ + @HostBinding('attr.aria-label') @Input() label: string | null = null; + /** + * Link to the id of an element that announces the purpose of the list. This will be set automatically + * to the id of the `mdcFloatingLabel` when the list is part of an `mdcSelect`. + * + * @internal + */ + @HostBinding('attr.aria-labelledBy') @Input() labelledBy: string | null = null; private _function: MdcListFunction = MdcListFunction.plain; + /** @internal */ _hidden = false; private _dense = false; private _avatar = false; private _nonInteractive = false; + private _selectionMode: 'single' | 'active' | null = null; + private _wrapFocus = false; + private mdcAdapter: MDCListAdapter = { + getAttributeForElementIndex: (index, attr) => { + if (attr === strings.ARIA_CURRENT) + return this.getItem(index)?._ariaCurrent; + return this.getItem(index)?._elm.nativeElement.getAttribute(attr); + }, + getListItemCount: () => this._items!.length, + getFocusedElementIndex: () => this._items!.toArray().findIndex(i => i._elm.nativeElement === this.document.activeElement!), + setAttributeForElementIndex: (index, attribute, value) => { + // ignore attributes we maintain ourselves + if (!ANGULAR_ITEM_ATTRIBUTES.find(a => a === attribute)) { + const elm = this.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.setAttribute(elm, attribute, value); + } + }, + addClassForElementIndex: (index, className) => { + if (!ANGULAR_ITEM_CLASSES.find(c => c === className)) { + const elm = this.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.addClass(elm, className); + } + }, + removeClassForElementIndex: (index, className) => { + if (!ANGULAR_ITEM_CLASSES.find(c => c === className)) { + const elm = this.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.addClass(elm, className); + } + }, + focusItemAtIndex: (index: number) => this.getItem(index)?._elm.nativeElement.focus(), + setTabIndexForListItemChildren: (index, tabIndexValue) => { + // TODO check this plays nice with our own components (mdcButton etc.) + // TODO build this in an abstract class for our own elements? + // TODO limit to our own elements/custom directive? + const elm = this.getItem(index)?._elm.nativeElement; + const listItemChildren: Element[] = [].slice.call(elm.querySelectorAll(strings.CHILD_ELEMENTS_TO_TOGGLE_TABINDEX)); + listItemChildren.forEach((el) => this.rndr.setAttribute(el, 'tabindex', tabIndexValue)); + }, + hasRadioAtIndex: () => this._role === 'radiogroup', + hasCheckboxAtIndex: () => this._role === 'group', + isCheckboxCheckedAtIndex: (index) => !!this.getItem(index)?._getCheckbox()?._input?.checked, + isRootFocused: () => this.document.activeElement === this._elm.nativeElement, + listItemAtIndexHasClass: (index, className) => { + if (className === cssClasses.LIST_ITEM_DISABLED_CLASS) + return !!this.getItem(index)?.disabled; + return !!this.getItem(index)?._elm.nativeElement.classList.contains(className); + }, + setCheckedCheckboxOrRadioAtIndex: (index, isChecked) => { + const item = this.getItem(index); + const input = (item?._getRadio() || item?._getCheckbox())?._input?._elm.nativeElement; + if (input) { + input.checked = isChecked; + // simulate user interaction, as this is triggered from a user interaction: + const event = this.document.createEvent('Event'); + event.initEvent('change', true, true); + input.dispatchEvent(event); + // checkbox input listens to clicks, not changed events, so let it know about the change: + item?._getCheckbox()?._input?._onChange(); + } + }, + notifyAction: (index) => { + const item = this.getItem(index); + if (item && !item?.disabled) { + item.action.emit(); + this.itemAction.emit({index, value: item.value}); + } + }, + isFocusInsideList: () => { + return this._elm.nativeElement.contains(this.document.activeElement); + }, + }; + /** @internal */ + foundation?: MDCListFoundation | null; - constructor(public _elm: ElementRef) {} + constructor(public _elm: ElementRef, private rndr: Renderer2, private cdRef: ChangeDetectorRef, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 + } ngAfterContentInit() { - this.updateItems(); - this._items.changes.subscribe(() => { + merge( + this._checkboxes!.changes, + this._radios!.changes + ).pipe(takeUntil(this.onDestroy$)).subscribe(() => { this.updateItems(); + this.updateLayout(); + this.updateFoundationSelections(); + }); + this._items!.changes.subscribe(() => { + // when number of items changes, we have to reinitialize the foundation, because + // the focusused item index that the foundation keeps may be invalidated: + this.destroyFoundation(); + this.updateItems(); + this.initFoundation(); + this.itemsChanged.emit(); + this.itemValuesChanged.emit(); + merge(this._items!.map(item => item.valueChanged.asObservable())).pipe( + takeUntil(this.onDestroy$), + takeUntil(this.itemsChanged), + debounceTime(1) + ).subscribe(() => { + this.itemValuesChanged.emit(); + }); + this.subscribeItemActivationRequests(); + }); + this._primaryTexts!.changes.subscribe(_ => this._twoLine = this._primaryTexts!.length > 0); + this.updateItems(); + this._twoLine = this._primaryTexts!.length > 0; + this.initFoundation(); + this.subscribeItemActivationRequests(); + } + + ngOnDestroy() { + this.onDestroy$.next(); this.onDestroy$.complete(); + this.destroyFoundation(); + } + + private initFoundation() { + this.foundation = new MDCListFoundation(this.mdcAdapter); + this.foundation.init(); + this.updateLayout(); + const focus = this.getListItemIndex({target: this.document.activeElement as EventTarget}); + if (focus !== -1) // only way to restore focus when a list item already had focus: + (this.foundation)['focusedItemIndex_'] = focus; + this.updateFoundationSelections(); + this.foundation.setWrapFocus(this._wrapFocus); + } + + private destroyFoundation() { + this.foundation?.destroy(); + this.foundation = null; + } + + private subscribeItemActivationRequests() { + this._items!.map(item => { + item._activationRequest.asObservable().pipe( + takeUntil(this.onDestroy$), + takeUntil(this.itemsChanged) + ).subscribe(active => this.activateOrSelectItem(item, active)); }); - this._texts.changes.subscribe(_ => this._twoLine = this._texts.length > 0); - this._twoLine = this._texts.length > 0; } private updateItems() { - let itemRole = null; - if (this._function === MdcListFunction.menu) - itemRole = 'menuitem'; - if (this._items) + let itemRole = { + 'menu': 'menuitem', + 'listbox': 'option', + 'group': 'checkbox', + 'radiogroup': 'radio' + }[this._role!] || null; + let ariaActive = { + 'menu': null, + 'listbox': this._selectionMode === 'active' ? 'current' : 'selected', + 'group': 'checked', + 'radiogroup': 'checked' + }[this._role!] || null; + if (this._items) { + const firstTabbable = this._nonInteractive ? null : + this._items.find(item => item._elm.nativeElement.tabIndex === 0) || + this._items.find(item => item.active) || + this._items.first; this._items.forEach(item => { item._role = itemRole; + item._ariaActive = ariaActive; item._setInteractive(!this._nonInteractive); + if (this._nonInteractive) + // not focusable if not interactive: + this.rndr.removeAttribute(item._elm.nativeElement, 'tabindex'); + this.rndr.setAttribute(item._elm.nativeElement, 'tabindex', item === firstTabbable ? '0' : '-1'); }); + // child components were updated (in updateItems above) + // let angular know to prevent ExpressionChangedAfterItHasBeenCheckedError: + this.cdRef.detectChanges(); + } } + private updateLayout() { + this.foundation?.layout(); + } + + private updateFoundationSelections() { + this.foundation?.setSingleSelection(this._role === 'listbox'); + this.foundation?.setSelectedIndex(this.getSelection()); + } + + private updateItemSelections(active: number | number[]) { + const activeIndexes = typeof active === 'number' ? [active] : active; + // first deactivate, then activate + this._items!.toArray().forEach((item, idx) => { + if (activeIndexes.indexOf(idx) === -1) + item.active = false; + }); + this._items!.toArray().forEach((item, idx) => { + if (activeIndexes.indexOf(idx) !== -1) + item.active = true; + }); + } + + private activateOrSelectItem(item: MdcListItemDirective, active: boolean) { + let activeIndexes: number | number[] = -1; + if (!active) { + if (this._role === 'group' || !this._role) + activeIndexes = this._items!.toArray().map((v, i) => v.active && v !== item ? i : null).filter(i => i != null); + else if (this._role === 'listbox' || this._role === 'radiogroup' || this._role === 'menu') + activeIndexes = this._items!.toArray().findIndex(i => i.active && i !== item); + } else { + if (this._role === 'group' || !this._role) + activeIndexes = this._items!.toArray().map((v, i) => v.active || v === item ? i : null).filter(i => i != null); + else if (this._role === 'listbox' || this._role === 'radiogroup' || this._role === 'menu') + activeIndexes = this._items!.toArray().findIndex(i => i === item); + } + if (this._role === 'group' || this._role === 'listbox' || this._role === 'radiogroup' || this._role === 'menu') + this.foundation?.setSelectedIndex(activeIndexes); + this.updateItemSelections(activeIndexes); + this.cdRef.detectChanges(); + } + + private getSelection(forFoundation = true): number | number[] { + if (this._role === 'listbox' || this._role === 'radiogroup' || this._role === 'menu') + return this._items!.toArray().findIndex(i => i.active); + if (this._role === 'group') + return this._items!.toArray().map((v, i) => v.active ? i : null).filter(i => i != null); + return forFoundation ? -1 : this._items!.toArray().map((v, i) => v.active ? i : null).filter(i => i != null); + } + + /** @internal */ + getSelectedItem() { + if (this._role === 'listbox' || this._role === 'radiogroup' || this._role === 'menu') + return this._items!.find(i => i.active); + return null; + } + + /** @internal */ @HostBinding('attr.role') get _role() { - return (this._function === MdcListFunction.menu) ? 'menu' : null; + if (this._function === MdcListFunction.menu) + return 'menu'; + if (this._function === MdcListFunction.select) + return 'listbox'; + if (this._selectionMode === 'single' || this._selectionMode === 'active') + return 'listbox'; + if (this._checkboxes && this._checkboxes.length > 0) + return 'group'; + if (this._radios && this._radios.length > 0) + return 'radiogroup'; + return null; } + /** @internal */ @HostBinding('attr.aria-hidden') get _ariaHidden() { return (this._hidden && this._function === MdcListFunction.menu) ? 'true' : null; } + /** @internal */ + @HostBinding('attr.aria-orientation') get _ariaOrientation() { + return this._function === MdcListFunction.menu ? 'vertical' : null; + } + + /** @internal */ @HostBinding('class.mdc-menu__items') get _isMenu() { return this._function === MdcListFunction.menu; } + /** @internal */ + @HostBinding('attr.tabindex') get _tabindex() { + // the root of a menu should be focusable + return this._function === MdcListFunction.menu ? "-1" : null; + } + + /** @internal */ _setFunction(val: MdcListFunction) { this._function = val; + this.foundation?.setSingleSelection(this._role === 'listbox'); this.updateItems(); } @@ -286,20 +723,59 @@ export class MdcListDirective implements AfterContentInit { return this._dense; } - set dense(val: any) { + set dense(val: boolean) { this._dense = asBoolean(val); } + static ngAcceptInputType_dense: boolean | ''; + /** - * When this input is defined and does not have value false, interactivity affordances for - * the list will be disabled. + * When set to `single` or `active`, the list will act as a single-selection-list. + * This enables the enter and space keys for selecting/deselecting a list item, + * and sets the appropriate accessibility options. + * When not set, the list will not act as a single-selection-list. + * + * When using `single`, the active selection is announced with `aria-selected` + * attributes on the list elements. When using `active`, the active selection + * is announced with `aria-current`. See [WAI-ARIA aria-current](https://www.w3.org/TR/wai-aria-1.1/#aria-current) + * article for recommendations on usage. + * + * The selectionMode is ignored when there are embedded checkbox or radio inputs inside the list, in which case + * those inputs will trigger selection of list items. + */ + @Input() + get selectionMode() { + return this._selectionMode; + } + + set selectionMode(val: 'single' | 'active' | null) { + if (val !== this._selectionMode) { + if (val === 'single' || val === 'active') + this._selectionMode = val; + else + this._selectionMode = null; + this.updateItems(); + if (this.foundation) { + this.foundation.setSingleSelection(this._role === 'listbox'); + this.foundation.setSelectedIndex(this.getSelection()); + this.updateItemSelections(this.getSelection(false)); + } + } + } + + static ngAcceptInputType_selectionMode: 'single' | 'active' | '' | null; + + /** + * When this input is defined and does not have value false, the list will be made + * non-interactive. Users will not be able to interact with list items, and the styling will + * reflect this (e.g. by not adding ripples to the items). */ @Input() @HostBinding('class.mdc-list--non-interactive') get nonInteractive() { return this._nonInteractive; } - set nonInteractive(val: any) { + set nonInteractive(val: boolean) { let newValue = asBoolean(val); if (newValue !== this._nonInteractive) { this._nonInteractive = newValue; @@ -307,6 +783,24 @@ export class MdcListDirective implements AfterContentInit { } } + static ngAcceptInputType_nonInteractive: boolean | ''; + + /** + * When this input is defined and does not have value false, focus will wrap from last to + * first and vice versa when using keyboard navigation through list items. + */ + @Input() + get wrapFocus() { + return this._wrapFocus; + } + + set wrapFocus(val: boolean) { + this._wrapFocus = asBoolean(val); + this.foundation?.setWrapFocus(this._wrapFocus); + } + + static ngAcceptInputType_wrapFocus: boolean | ''; + /** * When this input is defined and does not have value false, elements with directive mdcListItemGraphic * will be styled for avatars: large, circular elements that lend themselves well to contact images, profile pictures, etc. @@ -316,9 +810,85 @@ export class MdcListDirective implements AfterContentInit { return this._avatar; } - set avatarList(val: any) { + set avatarList(val: boolean) { this._avatar = asBoolean(val); } + + static ngAcceptInputType_avatarList: boolean | ''; + + /** @internal */ + @HostListener('focusin', ['$event']) _onFocusIn(event: FocusEvent) { + if (this.foundation && !this._nonInteractive) { + this.foundation.setSelectedIndex(this.getSelection()); + const index = this.getListItemIndex(event as {target: EventTarget}); + this.foundation.handleFocusIn(event, index); + } + } + + /** @internal */ + @HostListener('focusout', ['$event']) _onFocusOut(event: FocusEvent) { + if (this.foundation && !this._nonInteractive) { + this.foundation.setSelectedIndex(this.getSelection()); + const index = this.getListItemIndex(event as {target: EventTarget}); + this.foundation.handleFocusOut(event, index); + } + } + + /** @internal */ + @HostListener('keydown', ['$event']) _onKeydown(event: KeyboardEvent) { + if (this.foundation && !this._nonInteractive) { + this.foundation.setSelectedIndex(this.getSelection()); + const index = this.getListItemIndex(event as {target: EventTarget}); + const onRoot = this.getItem(index)?._elm.nativeElement === event.target; + this.foundation.handleKeydown(event, onRoot, index); + if (this._role === 'listbox') + this.updateItemSelections(this.foundation!.getSelectedIndex()); + } + } + + /** @internal */ + @HostListener('click', ['$event']) _onClick(event: MouseEvent) { + if (this.foundation && !this._nonInteractive) { + this.foundation.setSelectedIndex(this.getSelection()); + const index = this.getListItemIndex(event as {target: EventTarget}); + // only toggle radio/checkbox input if it's not already toggled from the event: + const inputElement = this.getItem(index)?._getCheckbox()?._input!._elm.nativeElement || + this.getItem(index)?._getRadio()?._input!._elm.nativeElement; + const toggleInput = event.target !== inputElement; + this.foundation.handleClick(index, toggleInput); + if (this._role === 'listbox') + this.updateItemSelections(this.foundation!.getSelectedIndex()); + } + } + + /** @internal */ + getItem(index: number): MdcListItemDirective | null { + if (index >= 0 && index < this._items!.length) + return this._items!.toArray()[index]; + return null; + } + + /** @internal */ + getItems(): MdcListItemDirective[] { + return this._items?.toArray() || []; + } + + /** @internal */ + getItemByElement(element: Element): MdcListItemDirective | null { + return this._items?.find(i => i._elm.nativeElement === element) || null; + } + + private getListItemIndex(evt: {target: EventTarget}) { + let eventTarget: Element | null = evt.target as Element; + const itemElements = this._items!.map(item => item._elm.nativeElement); + while (eventTarget && eventTarget !== this._elm.nativeElement) { + const index = itemElements.findIndex(e => e === eventTarget); + if (index !== -1) + return index; + eventTarget = eventTarget.parentElement; + } + return -1; + } } /** @@ -328,23 +898,33 @@ export class MdcListDirective implements AfterContentInit { selector: '[mdcListGroupSubHeader]' }) export class MdcListGroupSubHeaderDirective { - @HostBinding('class.mdc-list-group__subheader') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-list-group__subheader') readonly _cls = true; } /** - * Directive for a material designed list group, grouping several - * mdcList lists. - * List groups should contain elements with mdcListGroupSubHeader, - * and mdcList directives. + * Directive for a material designed list group, grouping several `mdcList` lists. + * List groups should contain elements with `mdcListGroupSubHeader`, + * and `mdcList` directives. Lists may be separated by `mdcListSeparator` directives. */ @Directive({ selector: '[mdcListGroup]' }) export class MdcListGroupDirective { - @HostBinding('class.mdc-list-group') _cls = true; - - constructor() {} + /** @internal */ + @HostBinding('class.mdc-list-group') readonly _cls = true; } + +export const LIST_DIRECTIVES = [ + MdcListDividerDirective, + MdcListItemDirective, + MdcListItemTextDirective, + MdcListItemPrimaryTextDirective, + MdcListItemSecondaryTextDirective, + MdcListItemGraphicDirective, + MdcListItemMetaDirective, + MdcListDirective, + MdcListGroupSubHeaderDirective, + MdcListGroupDirective +]; diff --git a/bundle/src/components/menu-surface/mdc.menu-surface.directive.spec.ts b/bundle/src/components/menu-surface/mdc.menu-surface.directive.spec.ts new file mode 100644 index 0000000..fc13736 --- /dev/null +++ b/bundle/src/components/menu-surface/mdc.menu-surface.directive.spec.ts @@ -0,0 +1,199 @@ +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { numbers } from '@material/menu-surface'; +import { MENU_SURFACE_DIRECTIVES } from './mdc.menu-surface.directive'; +import { simulateKey } from '../../testutils/page.test'; + +describe('mdcMenuSurface', () => { + @Component({ + template: ` +
+
+
+ `, + styles: [` + #anchor { + left: 150px; + top: 150px; + width: 80px; + height: 20px; + background-color: red; + } + #surface { + width: 150px; + height: 300px; + }` + ] + }) + class TestComponent { + notifications = []; + open = null; + openFrom = null; + fixed = null; + notify(name: string, value: boolean) { + let notification = {}; + notification[name] = value; + this.notifications.push(notification); + } + } + + it('open and close', fakeAsync(() => { + const { fixture, anchor, surface, testComponent } = setup(); + expect(anchor).not.toBeNull(); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + testComponent.open = true; + animationCycle(fixture, () => expect(testComponent.notifications).toEqual([{open: true}])); + expect(testComponent.notifications).toEqual([{open: true}, {afterOpened: true}]); + expect(surface.classList).toContain('mdc-menu-surface--open'); + const position = surface.style['transform-origin'].split(' '); // left,bottom or left,top depending on size of window + expect(position[0]).toBe('left'); + expect(surface.style['transform-origin']).toBe(position.join(' ')); + expect(surface.style[position[0]]).toBe('0px', position[0]); + expect(surface.style[position[1]]).toBe('0px', position[1]); + testComponent.notifications = []; + testComponent.open = false; + animationCycle(fixture, () => expect(testComponent.notifications).toEqual([{open: false}])); + expect(testComponent.notifications).toEqual([{open: false}, {afterClosed: true}]); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + + testComponent.open = true; + testComponent.openFrom = 'tr'; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + expect(surface.style['transform-origin']).toBe(position.join(' ')); + expect(surface.style[position[0]]).toBe('80px', position[0]); + expect(surface.style[position[1]]).toBe('0px', position[1]); + + testComponent.open = false; + animationCycle(fixture); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + + testComponent.open = true; + testComponent.openFrom = 'br'; + animationCycle(fixture); + expect(surface.style['transform-origin']).toBe(position.join(' ')); + expect(surface.style[position[0]]).toBe('80px', position[0]); + expect(surface.style[position[1]]).toBe('20px', position[1]); + })); + + it('focus restore', fakeAsync(() => { + const { fixture, surface, anchor, testComponent } = setup(); + anchor.focus(); + expect(document.activeElement).toBe(anchor); + testComponent.open = true; + animationCycle(fixture); + surface.focus(); + expect(document.activeElement).toBe(surface); + testComponent.open = false; + animationCycle(fixture); + expect(document.activeElement).toBe(anchor); + })); + + it('fixed positioning', fakeAsync(() => { + const { fixture, surface, testComponent } = setup(); + testComponent.fixed = true; + testComponent.open = true; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--fixed'); + })); + + it('hoisted positioning', fakeAsync(() => { + const { fixture, anchor, surface, testComponent } = setup(); + expect(anchor).not.toBeNull(); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + testComponent.hoisted = true; + testComponent.open = true; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + const position = surface.style['transform-origin'].split(' '); // left,bottom or left,top depending on size of window + expect(position[0]).toBe('left'); + expect(surface.style['transform-origin']).toBe(position.join(' ')); + expect(surface.style[position[0]]).not.toBe('0px', position[0]); + expect(surface.style[position[1]]).not.toBe('0px', position[1]); + })); + + it('close by outside bodyclick', fakeAsync(() => { + const { fixture, surface, testComponent } = setup(); + testComponent.open = true; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + + // clicking on surface itself does nothing: + testComponent.notifications = []; + surface.click(); + animationCycle(fixture); + expect(testComponent.notifications).toEqual([]); + expect(surface.classList).toContain('mdc-menu-surface--open'); + + document.body.click(); + animationCycle(fixture, () => expect(testComponent.notifications).toEqual([{open: false}])); + expect(testComponent.notifications).toEqual([{open: false}, {afterClosed: true}]); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + })); + + it('close by outside ESC key', fakeAsync(() => { + const { fixture, surface, testComponent } = setup(); + testComponent.open = true; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + + // TAB key does nothing + testComponent.notifications = []; + simulateKey(surface, 'Enter'); + animationCycle(fixture); + expect(testComponent.notifications).toEqual([]); + expect(surface.classList).toContain('mdc-menu-surface--open'); + + simulateKey(surface, 'Escape'); + animationCycle(fixture, () => expect(testComponent.notifications).toEqual([{open: false}])); + expect(testComponent.notifications).toEqual([{open: false}, {afterClosed: true}]); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + })); + + @Component({ + template: `
`, + styles: [` + #surface { + width: 150px; + height: 300px; + }` + ] + }) + class TestWithoutAnchorComponent { + open = null; + } + + it('no anchor', fakeAsync(() => { + const { fixture, surface, testComponent } = setup(TestWithoutAnchorComponent); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + testComponent.open = true; + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + testComponent.open = false; + animationCycle(fixture); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + })); + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...MENU_SURFACE_DIRECTIVES, compType] + }).createComponent(compType); + fixture.detectChanges(); + const testComponent = fixture.debugElement.injector.get(compType); + const anchor: HTMLElement = fixture.nativeElement.querySelector('.mdc-menu-surface--anchor'); + const surface: HTMLElement = fixture.nativeElement.querySelector('.mdc-menu-surface'); + return { fixture, anchor, surface, testComponent }; + } + + function animationCycle(fixture, checksBeforeAnimation: () => void = () => {}) { + fixture.detectChanges(); + checksBeforeAnimation(); + tick(Math.max(numbers.TRANSITION_CLOSE_DURATION, numbers.TRANSITION_OPEN_DURATION)); + flush(); + } +}); diff --git a/bundle/src/components/menu-surface/mdc.menu-surface.directive.ts b/bundle/src/components/menu-surface/mdc.menu-surface.directive.ts new file mode 100644 index 0000000..2a7423f --- /dev/null +++ b/bundle/src/components/menu-surface/mdc.menu-surface.directive.ts @@ -0,0 +1,329 @@ +import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, + Input, OnDestroy, QueryList, Renderer2, Output, EventEmitter, HostListener, Inject } from '@angular/core'; +import { MDCMenuSurfaceFoundation, MDCMenuSurfaceAdapter, util, cssClasses, Corner } from '@material/menu-surface'; +import { asBoolean } from '../../utils/value.utils'; +import { DOCUMENT } from '@angular/common'; + +/** + * The `mdcMenuSurface` is a reusable surface that appears above the content of the page + * and can be positioned adjacent to an element. It is required as the surface for an `mdcMenu` + * but can also be used by itself. + */ +@Directive({ + selector: '[mdcMenuSurface],[mdcMenu],[mdcSelectMenu]' +}) +export class MdcMenuSurfaceDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-menu-surface') readonly _cls = true; + private _open = false; + private _openFrom: 'tl' | 'tr' | 'bl' | 'br' | 'ts' | 'te' | 'bs' | 'be' = 'ts'; + // the anchor to use if no menuAnchor is provided (a direct parent MdcMenuAnchor if available): + /** @internal */ + _parentAnchor: MdcMenuAnchorDirective | null = null; + /** + * Assign an (optional) element or `mdcMenuAnchor`. If set the menu + * will position itself relative to this anchor element. Assigning this property is not needed + * if you wrap your surface inside an `mdcMenuAnchor`. + */ + @Input() menuAnchor: MdcMenuAnchorDirective | Element | null = null; + /** + * Assign any `HTMLElement` to this property to use as the viewport instead of + * the window object. The menu will choose to open from the top or bottom, and + * from the left or right, based on the space available inside the viewport. + * + * You should probably not use this property. We only use it to keep the documentation + * snippets on our demo website contained in their window. + */ + @Input() viewport: HTMLElement | null = null; + /** + * Event emitted when the menu is opened or closed. (When this event is triggered, the + * surface is starting to open/close, but the animation may not have fully completed + * yet). + */ + @Output() readonly openChange: EventEmitter = new EventEmitter(); + /** + * Event emitted after the menu has fully opened. When this event is emitted the full + * opening animation has completed, and the menu is visible. + */ + @Output() readonly afterOpened: EventEmitter = new EventEmitter(); + /** + * Event emitted after the menu has fully closed. When this event is emitted the full + * closing animation has completed, and the menu is not visible anymore. + */ + @Output() readonly afterClosed: EventEmitter = new EventEmitter(); + private _prevFocus: Element | null = null; + private _hoisted = false; + private _fixed = false; + private _handleBodyClick = (event: MouseEvent) => this.handleBodyClick(event); + + private mdcAdapter: MDCMenuSurfaceAdapter = { + addClass: (className: string) => this.rndr.addClass(this._elm.nativeElement, className), + removeClass: (className: string) => this.rndr.removeClass(this._elm.nativeElement, className), + hasClass: (className: string) => { + if (className === cssClasses.ROOT) + return true; + if (className === cssClasses.OPEN) + return this._open; + return this._elm.nativeElement.classList.contains(className); + }, + hasAnchor: () => !!this._parentAnchor || !!this.menuAnchor, + isElementInContainer: (el: Element) => this._elm.nativeElement.contains(el), + isFocused: () => this.document.activeElement === this._elm.nativeElement, + isRtl: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', + getInnerDimensions: () => ({width: this._elm.nativeElement.offsetWidth, height: this._elm.nativeElement.offsetHeight}), + getAnchorDimensions: () => { + const anchor = this.menuAnchor || this._parentAnchor; + if (!anchor) + return null; + if (!this.viewport) + return anchor.getBoundingClientRect(); + let viewportRect = this.viewport.getBoundingClientRect(); + let anchorRect = anchor.getBoundingClientRect(); + return { + bottom: anchorRect.bottom - viewportRect.top, + left: anchorRect.left - viewportRect.left, + right: anchorRect.right - viewportRect.left, + top: anchorRect.top - viewportRect.top, + width: anchorRect.width, + height: anchorRect.height + }; + }, + getWindowDimensions: () => ({ + width: this.viewport ? this.viewport.clientWidth : this.document.defaultView!.innerWidth, + height: this.viewport ? this.viewport.clientHeight : this.document.defaultView!.innerHeight + }), + getBodyDimensions: () => ({ + width: this.viewport ? this.viewport.scrollWidth : this.document.body.clientWidth, + height: this.viewport ? this.viewport.scrollHeight : this.document.body.clientHeight}), + getWindowScroll: () => ({ + x: this.viewport ? this.viewport.scrollLeft : this.document.defaultView!.pageXOffset, + y: this.viewport ? this.viewport.scrollTop : this.document.defaultView!.pageYOffset + }), + setPosition: (position) => { + let el = this._elm.nativeElement; + this.rndr.setStyle(el, 'left', 'left' in position ? `${position.left}px` : ''); + this.rndr.setStyle(el, 'right', 'right' in position ? `${position.right}px` : ''); + this.rndr.setStyle(el, 'top', 'top' in position ? `${position.top}px` : ''); + this.rndr.setStyle(el, 'bottom', 'bottom' in position ? `${position.bottom}px` : ''); + }, + setMaxHeight: (height: string) => this._elm.nativeElement.style.maxHeight = height, + setTransformOrigin: (origin: string) => this.rndr.setStyle(this._elm.nativeElement, + `${util.getTransformPropertyName(this.document.defaultView!)}-origin`, origin), + saveFocus: () => this._prevFocus = this.document.activeElement, + restoreFocus: () => this._elm.nativeElement.contains(this.document.activeElement) && this._prevFocus + && (this._prevFocus as any)['focus'] && (this._prevFocus as any)['focus'](), + notifyClose: () => { + this.afterClosed.emit(); + this.document.removeEventListener('click', this._handleBodyClick); + }, + notifyOpen: () => { + this.afterOpened.emit(); + this.document.addEventListener('click', this._handleBodyClick); + } + }; + /** @docs-private */ + private foundation: MDCMenuSurfaceFoundation | null = null; + private document: Document; + + constructor(private _elm: ElementRef, private rndr: Renderer2, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 + } + + ngAfterContentInit() { + this.foundation = new MDCMenuSurfaceFoundation(this.mdcAdapter); + this.foundation.init(); + this.foundation.setFixedPosition(this._fixed); + this.foundation.setIsHoisted(this._hoisted); + this.updateFoundationCorner(); + if (this._open) + this.foundation.open(); + } + + ngOnDestroy() { + // when we're destroying a closing surface, the event listener may not be removed yet: + this.document.removeEventListener('click', this._handleBodyClick); + this.foundation?.destroy(); + this.foundation = null; + } + + /** + * When this input is defined and does not have value false, the menu will be opened, + * otherwise the menu will be closed. + */ + @Input() @HostBinding('class.mdc-menu-surface--open') + get open() { + return this._open; + } + + set open(val: boolean) { + let newValue = asBoolean(val); + if (newValue !== this._open) { + this._open = newValue; + if (newValue) + this.foundation?.open(); + else + this.foundation?.close(); + this.openChange.emit(newValue); + } + } + + static ngAcceptInputType_open: boolean | ''; + + /** @internal */ + closeWithoutFocusRestore() { + if (this._open) { + this._open = false; + this.foundation?.close(true); + this.openChange.emit(false); + } + } + + /** + * Set this value if you want to customize the direction from which the menu will be opened. + * Use `tl` for top-left, `br` for bottom-right, etc. + * When the left/right position depends on the text directionality, use `ts` for top-start, + * `te` for top-end, etc. Start will map to left in left-to-right text directionality, and to + * to right in right-to-left text directionality. End maps the other way around. + * The default value is 'ts'. + */ + @Input() + get openFrom(): 'tl' | 'tr' | 'bl' | 'br' | 'ts' | 'te' | 'bs' | 'be' { + return this._openFrom; + } + + set openFrom(val: 'tl' | 'tr' | 'bl' | 'br' | 'ts' | 'te' | 'bs' | 'be') { + if (val !== this.openFrom) { + if (['tl', 'tr', 'bl', 'br', 'ts', 'te', 'bs', 'be'].indexOf(val) !== -1) + this._openFrom = val; + else + this._openFrom = 'ts'; + this.updateFoundationCorner(); + } + } + + private updateFoundationCorner() { + const corner: Corner = { + 'tl': Corner.TOP_LEFT, + 'tr': Corner.TOP_RIGHT, + 'bl': Corner.BOTTOM_LEFT, + 'br': Corner.BOTTOM_RIGHT, + 'ts': Corner.TOP_START, + 'te': Corner.TOP_END, + 'bs': Corner.BOTTOM_START, + 'be': Corner.BOTTOM_END + }[this._openFrom]; + this.foundation?.setAnchorCorner(corner); + } + + /** @internal */ + setFoundationAnchorCorner(corner: Corner) { + this.foundation?.setAnchorCorner(corner); + } + + /** + * Set to a value other then false to hoist the menu surface to the body so that the position offsets + * are calculated relative to the page and not the anchor. (When a `viewport` is set, hoisting is done to + * the viewport instead of the body). + */ + @Input() + get hoisted() { + return this._hoisted; + } + + set hoisted(val: boolean) { + let newValue = asBoolean(val); + if (newValue !== this._hoisted) { + this._hoisted = newValue; + this.foundation?.setIsHoisted(newValue); + } + } + + static ngAcceptInputType_hoisted: boolean | ''; + + /** + * Set to a value other then false use fixed positioning, so that the menu stays in the + * same place on the window (or viewport) even if the page (or viewport) is + * scrolled. + */ + @Input() @HostBinding('class.mdc-menu-surface--fixed') + get fixed() { + return this._fixed; + } + + set fixed(val: boolean) { + let newValue = asBoolean(val); + if (newValue !== this._fixed) { + this._fixed = newValue; + this.foundation?.setFixedPosition(newValue); + } + } + + static ngAcceptInputType_fixed: boolean | ''; + + // listened after notifyOpen, listening stopped after notifyClose + /** @internal */ + handleBodyClick(event: MouseEvent) { + if (this.foundation) { + this.foundation.handleBodyClick(event); + if (this._open && this._open !== this.foundation.isOpen()) {// if just closed: + this._open = false; + this.openChange.emit(false); + } + } + } + + /** @internal */ + @HostListener('keydown', ['$event']) + handleKeydow(event: KeyboardEvent) { + if (this.foundation) { + this.foundation.handleKeydown(event); + if (this._open && this._open !== this.foundation.isOpen()) {// if just closed: + this._open = false; + this.openChange.emit(false); + } + } + } +} + +/** + * Defines an anchor to position an `mdcMenuSurface` to. If this directive is used as the direct parent of an `mdcMenuSurface`, + * it will automatically be used as the anchor point. (Unless de `mdcMenuSurface` sets another anchor via its `menuAnchor`property). + */ +@Directive({ + selector: '[mdcMenuAnchor]' +}) +export class MdcMenuAnchorDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-menu-surface--anchor') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcMenuSurfaceDirective) private surfaces?: QueryList; + + constructor(public _elm: ElementRef) {} + + ngAfterContentInit() { + this.surfaces!.changes.subscribe(_ => { + this.setSurfaces(this); + }); + this.setSurfaces(this); + } + + ngOnDestroy() { + this.setSurfaces(null); + } + + private setSurfaces(anchor: MdcMenuAnchorDirective | null) { + this.surfaces?.toArray().forEach(surface => { + surface._parentAnchor = anchor; + }); + } + + /** @internal */ + public getBoundingClientRect() { + return this._elm.nativeElement.getBoundingClientRect(); + } +} + +export const MENU_SURFACE_DIRECTIVES = [ + MdcMenuAnchorDirective, + MdcMenuSurfaceDirective +]; diff --git a/bundle/src/components/menu/mdc.menu.adapter.ts b/bundle/src/components/menu/mdc.menu.adapter.ts deleted file mode 100644 index 3b15eb0..0000000 --- a/bundle/src/components/menu/mdc.menu.adapter.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** @docs-private */ -export interface MdcMenuAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - hasClass: (className: string) => boolean, - hasNecessaryDom: () => boolean, - getAttributeForEventTarget: (target: Element, attrName: string) => string, - getInnerDimensions: () => {width: number, height: number}, - hasAnchor: () => boolean, - getAnchorDimensions: () => {width: number, height: number, top: number, right: number, bottom: number, left: number}, - getWindowDimensions: () => {width: number, height: number}, - getNumberOfItems: () => number, - registerInteractionHandler: (type: string, handler: EventListener) => void, - deregisterInteractionHandler: (type: string, handler: EventListener) => void, - registerBodyClickHandler: (handler: EventListener) => void, - deregisterBodyClickHandler: (handler: EventListener) => void, - getIndexForEventTarget: (target: EventTarget) => number, - notifySelected: (evtData: {index: number}) => void, - notifyCancel: () => void, - saveFocus: () => void, - restoreFocus: () => void, - isFocused: () => boolean, - focus: () => void, - getFocusedItemIndex: () => number, - focusItemAtIndex: (index: number) => void, - isRtl: () => boolean, - setTransformOrigin: (origin: string) => void, - setPosition: (position: {top: string | undefined, right: string | undefined, bottom: string | undefined, left: string | undefined}) => void, - setMaxHeight: (value: string) => void -} diff --git a/bundle/src/components/menu/mdc.menu.directive.spec.ts b/bundle/src/components/menu/mdc.menu.directive.spec.ts new file mode 100644 index 0000000..0149e30 --- /dev/null +++ b/bundle/src/components/menu/mdc.menu.directive.spec.ts @@ -0,0 +1,375 @@ +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { DefaultFocusState } from '@material/menu'; +import { LIST_DIRECTIVES } from '../list/mdc.list.directive'; +import { MENU_SURFACE_DIRECTIVES } from '../menu-surface/mdc.menu-surface.directive'; +import { MENU_DIRECTIVES, MdcMenuDirective } from '../menu/mdc.menu.directive'; +import { simulateKey } from '../../testutils/page.test'; +import { By } from '@angular/platform-browser'; + +describe('mdcMenu', () => { + @Component({ + template: ` + before +
+ +
+
    +
  • A Menu Item
  • +
  • Another Menu Item
  • +
+
+
+ after + `, + styles: [` + #anchor { + left: 150px; + top: 150px; + width: 80px; + height: 20px; + }` + ] + }) + class TestComponent { + notifications = []; + open = null; + openFrom = null; + fixed = null; + item2disabled = null; + notify(name: string, value: any) { + let notification = {}; + notification[name] = value; + this.notifications.push(notification); + } + } + + it('open with ArrowDown', fakeAsync(() => { + const { fixture, trigger } = setup(); + validateOpenBy(fixture, () => { + simulateKey(trigger, 'ArrowDown'); + }); + expect(document.activeElement).toBe(listElement(fixture, 0)); + })); + + it('open with ArrowUp', fakeAsync(() => { + const { fixture, trigger } = setup(); + validateOpenBy(fixture, () => { + simulateKey(trigger, 'ArrowUp'); + }); + expect(document.activeElement).toBe(listElement(fixture, 1)); + })); + + it('open with Enter', fakeAsync(() => { + const { fixture, trigger } = setup(); + validateOpenBy(fixture, () => { + simulateKey(trigger, 'Enter'); + trigger.click(); + simulateKey(trigger, 'Enter', 'keyup'); + }); + expect(document.activeElement).toBe(listElement(fixture, 0)); + })); + + it('open with Space', fakeAsync(() => { + const { fixture, trigger } = setup(); + validateOpenBy(fixture, () => { + simulateKey(trigger, 'Space'); + trigger.click(); + simulateKey(trigger, 'Space', 'keyup'); + }); + expect(document.activeElement).toBe(listElement(fixture, 0)); + })); + + it('open with click', fakeAsync(() => { + const { fixture, trigger, list } = setup(); + validateOpenBy(fixture, () => { + trigger.click(); + }); + expect(document.activeElement).toBe(list); + })); + + it('close restores focus', fakeAsync(() => { + const { fixture, surface, before, trigger, list } = setup(); + before.focus(); + validateOpenBy(fixture, () => trigger.click()); + expect(document.activeElement).toBe(list); + validateCloseBy(fixture, () => simulateKey(surface, 'Escape')); + expect(document.activeElement).toBe(before); + })); + + it('close with tab key does not restore focus', fakeAsync(() => { + const { fixture, surface, list, before, trigger, testComponent } = setup(); + before.focus(); + validateOpenBy(fixture, () => trigger.click()); + expect(document.activeElement).toBe(list); + validateCloseBy(fixture, () => simulateKey(surface, 'Tab')); + // focus is unchanged from open state - (when a user presses the Tab key, focus will be changed to the next element) + expect(document.activeElement).toBe(list); + // no menu item picked: + expect(testComponent.notifications).toEqual([]); + })); + + it('close with picking a menu item restores focus', fakeAsync(() => { + const { fixture, before, testComponent } = setup(); + before.focus(); + validateCloseBy(fixture, () => listElement(fixture, 1).click()); + expect(document.activeElement).toBe(before); + expect(testComponent.notifications).toEqual([ + {pick: {index: 1, value: null}} + ]); + })); + + it('menu list has role=menu; items have role=menuitem', fakeAsync(() => { + const { list, items } = setup(); + expect(list.getAttribute('role')).toBe('menu'); + items.forEach(item => expect(item.getAttribute('role')).toBe('menuitem')); + })); + + it('menu list aria attributes and tabindex', fakeAsync(() => { + const { fixture, surface, list, trigger } = setup(); + expect(list.getAttribute('tabindex')).toBe('-1'); + expect(list.getAttribute('aria-hidden')).toBe('true'); + expect(list.getAttribute('aria-orientation')).toBe('vertical'); + + validateOpenBy(fixture, () => trigger.click()); + expect(list.hasAttribute('aria-hidden')).toBeFalse(); + + validateCloseBy(fixture, () => simulateKey(surface, 'Escape')); + expect(list.getAttribute('aria-orientation')).toBe('vertical'); + })); + + it('disabled menu item', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.item2disabled = true; + fixture.detectChanges(); + + const items = [...fixture.nativeElement.querySelectorAll('li')]; + expect(items[0].classList).not.toContain('mdc-list-item--disabled'); + expect(items[0].hasAttribute('aria-disabled')).toBeFalse(); + expect(items[1].classList).toContain('mdc-list-item--disabled'); + expect(items[1].getAttribute('aria-disabled')).toBe('true'); + })); + + @Component({ + template: ` +
+ +
+
    +
  • 1 - 1
  • +
+
    +
  • 2 - 1
  • +
  • 2 - 2
  • +
+
+
+ after + ` + }) + class TestChangeListComponent { + firstList = true; + } + + it('underlying list can be changed', fakeAsync(() => { + let { fixture, list, items, trigger, testComponent } = setup(TestChangeListComponent); + + expect(list.id).toBe('list1'); + expect(list.getAttribute('role')).toBe('menu'); + items.forEach(item => expect(item.getAttribute('role')).toBe('menuitem')); + expect(list.getAttribute('tabindex')).toBe('-1'); + + testComponent.firstList = false; + fixture.detectChanges(); tick(); + + list = fixture.nativeElement.querySelector('ul'); + items = [...fixture.nativeElement.querySelectorAll('li')]; + expect(list.id).toBe('list2'); + expect(list.getAttribute('role')).toBe('menu'); + items.forEach(item => expect(item.getAttribute('role')).toBe('menuitem')); + expect(list.getAttribute('tabindex')).toBe('-1'); + + validateOpenBy(fixture, () => trigger.click(), TestChangeListComponent); + })); + + @Component({ + template: ` +
+ +
+
    +
  • + {{item.text}} +
  • +
+
+
+ ` + }) + class TestListItemNgForComponent { + items = [ + {value: 'item1', text: 'First Item'}, + {value: 'item2', text: 'Second Item'} + ]; + } + it('menu items in ngFor', fakeAsync(() => { + let { fixture, list, items, trigger, testComponent } = setup(TestListItemNgForComponent); + + expect(list.getAttribute('role')).toBe('menu'); + expect(items.length).toBe(2); + items.forEach(item => expect(item.getAttribute('role')).toBe('menuitem')); + expect(list.getAttribute('tabindex')).toBe('-1'); + + testComponent.items.push({value: 'item3', text: 'Third Item'}); + // this would previously throw ExpressionChangedAfterItHasBeenCheckedError; + // fixed by calling ChangeDetectorRef.detectChanges after child components are + // updated in MdcListDirective.ngAfterContentInit: + fixture.detectChanges(); tick(); + + list = fixture.nativeElement.querySelector('ul'); + items = [...fixture.nativeElement.querySelectorAll('li')]; + expect(list.getAttribute('role')).toBe('menu'); + expect(items.length).toBe(3); + items.forEach(item => expect(item.getAttribute('role')).toBe('menuitem')); + expect(list.getAttribute('tabindex')).toBe('-1'); + + validateOpenBy(fixture, () => trigger.click(), TestListItemNgForComponent); + })); + + function validateOpenBy(fixture, doOpen: () => void, compType: Type = TestComponent) { + const { surface } = getElements(fixture, compType); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + doOpen(); + animationCycle(fixture); + expect(surface.classList).toContain('mdc-menu-surface--open'); + validateDefaultFocusState(fixture); + } + + function validateCloseBy(fixture, doClose: () => void, compType: Type = TestComponent) { + const { surface } = getElements(fixture, compType); + doClose(); + animationCycle(fixture); + expect(surface.classList).not.toContain('mdc-menu-surface--open'); + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...LIST_DIRECTIVES, ...MENU_SURFACE_DIRECTIVES, ...MENU_DIRECTIVES, ...LIST_DIRECTIVES, compType] + }).createComponent(compType); + fixture.detectChanges(); tick(); + return getElements(fixture, compType); + } + + function getElements(fixture, compType: Type = TestComponent) { + const testComponent = fixture.debugElement.injector.get(compType); + const menuDirective = fixture.debugElement.query(By.directive(MdcMenuDirective)).injector.get(MdcMenuDirective); + const anchor: HTMLElement = fixture.nativeElement.querySelector('.mdc-menu-surface--anchor'); + const surface: HTMLElement = fixture.nativeElement.querySelector('.mdc-menu-surface'); + const trigger: HTMLElement = fixture.nativeElement.querySelector('button'); + const list: HTMLElement = fixture.nativeElement.querySelector('ul'); + const before: HTMLAnchorElement = fixture.nativeElement.querySelectorAll('a').item(0); + const after: HTMLAnchorElement = fixture.nativeElement.querySelectorAll('a').item(1); + const items: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('li')]; + return { fixture, anchor, surface, trigger, list, testComponent, menuDirective, before, after, items }; + } + + function listElement(fixture, index) { + return fixture.nativeElement.querySelectorAll('li').item(index); + } + + function validateDefaultFocusState(fixture) { + const menuDirective = fixture.debugElement.query(By.directive(MdcMenuDirective)).injector.get(MdcMenuDirective); + // default focus state should always NONE when not currently handling an open/close: + expect(menuDirective['foundation']['defaultFocusState_']).toBe(DefaultFocusState.NONE); + } +}); + +describe('mdcMenuTrigger', () => { + @Component({ + template: ` +
+ Open Menu1 +
+
    +
  • A Menu Item
  • +
  • Another Menu Item
  • +
+
+
+
+ +
+
    +
  • A Menu Item
  • +
  • Another Menu Item
  • +
+
+
+ + `, + styles: [` + #anchor { + left: 150px; + top: 150px; + width: 80px; + height: 20px; + }` + ] + }) + class TestComponent { + open = [false, false, false]; + } + + it('accessibility attributes mdcMenuTrigger', fakeAsync(() => { + const { fixture, triggers, surfaces } = setup(); + // anchor element as menuTrigger; template assigned id: + expect(surfaces[0].id).toBe('surface1'); + expect(triggers[0].getAttribute('role')).toBe('button'); + expect(triggers[0].getAttribute('aria-haspopup')).toBe('menu'); + expect(triggers[0].getAttribute('aria-controls')).toBe('surface1'); + expect(triggers[0].hasAttribute('aria-expanded')).toBeFalse(); + // button as menuTrigger, unique id assigned by menu: + expect(surfaces[1].id).toMatch(/mdc-menu-.*/); + expect(triggers[1].hasAttribute('role')).toBeFalse(); + expect(triggers[1].getAttribute('aria-haspopup')).toBe('menu'); + expect(triggers[1].getAttribute('aria-controls')).toBe(surfaces[1].id); + expect(triggers[1].hasAttribute('aria-expanded')).toBeFalse(); + // not attached to a menu: + expect(triggers[2].hasAttribute('role')).toBeFalse(); + expect(triggers[2].hasAttribute('aria-haspopup')).toBeFalse(); + expect(triggers[2].hasAttribute('aria-controls')).toBeFalse(); + expect(triggers[2].hasAttribute('aria-expanded')).toBeFalse(); + + // open: + triggers[0].click(); + animationCycle(fixture); + expect(triggers[0].getAttribute('aria-expanded')).toBe('true'); + + // close: + simulateKey(surfaces[0], 'Escape'); + animationCycle(fixture); + expect(triggers[0].hasAttribute('aria-expanded')).toBeFalse(); + })); + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...LIST_DIRECTIVES, ...MENU_SURFACE_DIRECTIVES, ...MENU_DIRECTIVES, ...LIST_DIRECTIVES, compType] + }).createComponent(compType); + fixture.detectChanges(); + return getElements(fixture); + } + + function getElements(fixture, compType: Type = TestComponent) { + const testComponent = fixture.debugElement.injector.get(compType); + const surfaces: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-menu-surface')]; + const triggers: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('a,button')]; + return { fixture, surfaces, triggers, testComponent }; + } +}); + +function animationCycle(fixture) { + fixture.detectChanges(); tick(300); flush(); +} + diff --git a/bundle/src/components/menu/mdc.menu.directive.ts b/bundle/src/components/menu/mdc.menu.directive.ts index 672065f..5cc92eb 100644 --- a/bundle/src/components/menu/mdc.menu.directive.ts +++ b/bundle/src/components/menu/mdc.menu.directive.ts @@ -1,18 +1,11 @@ import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, - Input, OnDestroy, Output, QueryList, Renderer2 } from '@angular/core'; -import { MDCMenuFoundation, MDCMenu } from '@material/menu'; -import { getTransformPropertyName } from '@material/menu/util'; -import { MdcMenuAdapter } from './mdc.menu.adapter'; + Input, OnDestroy, Output, QueryList, Renderer2, Self, HostListener, OnInit } from '@angular/core'; +import { cssClasses as listCssClasses } from '@material/list'; +import { MDCMenuFoundation, MDCMenuAdapter, cssClasses, strings, DefaultFocusState } from '@material/menu'; +import { MdcMenuSurfaceDirective } from '../menu-surface/mdc.menu-surface.directive'; import { MdcListDirective, MdcListFunction } from '../list/mdc.list.directive'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -const CLASS_MENU = 'mdc-menu'; -const CLASS_MENU_OPEN = 'mdc-menu--open'; -const CLASS_TOP_LEFT = 'mdc-menu--open-from-top-left'; -const CLASS_TOP_RIGHT = 'mdc-menu--open-from-top-right'; -const CLASS_BOTTOM_LEFT = 'mdc-menu--open-from-bottom-left'; -const CLASS_BOTTOM_RIGHT = 'mdc-menu--open-from-bottom-right'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; /** * Data send by the pick event of MdcMenuDirective. @@ -28,275 +21,343 @@ export interface MdcMenuSelection { index: number } -/** - * Directive for an optional anchor to which a menu can position itself. - * Use the menuAnchor input of MdcMenuDirective - * to bind the menu to the anchor. The anchor must be a direct parent of the menu. - * It will get the following styles to make the positioning work: - * position: relative; overflow: visible;. - */ -@Directive({ - selector: '[mdcMenuAnchor]', - exportAs: 'mdcMenuAnchor' -}) -export class MdcMenuAnchorDirective { - @HostBinding('class.mdc-menu-anchor') _cls = true; +// attributes on list-items that we maintain ourselves, so should be ignored +// in the adapter: +const ANGULAR_ITEM_ATTRIBUTES = [ + strings.ARIA_CHECKED_ATTR, strings.ARIA_DISABLED_ATTR +]; +// classes on list-items that we maintain ourselves, so should be ignored +// in the adapter: +const ANGULAR_ITEM_CLASSES = [ + listCssClasses.LIST_ITEM_DISABLED_CLASS, cssClasses.MENU_SELECTED_LIST_ITEM +]; - constructor(public _elm: ElementRef) { - } -} +export enum FocusOnOpen {first = 0, last = 1, root = -1}; +let nextId = 1; /** * Directive for a spec aligned material design Menu. - * This directive should wrap an MdcListDirective. The mdcList - * contains the menu items (and possible separators). + * This directive should wrap an `mdcList`. The `mdcList` contains the menu items (and possible separators). + * + * An `mdcMenu` element will also match with the selector of the menu surface directive, documented + * here: mdcMenuSurface. The + * mdcMenuAnchor API is documented on the same page. + * + * # Accessibility + * + * * For `role` and `aria-*` attributes on the list, see documentation for `mdcList`. + * * The best way to open the menu by user interaction is to use the `mdcMenuTrigger` directive + * on the interaction element (e.g. button). This takes care of following ARIA recommended practices + * for focusing the correct element, and maintaining proper `aria-*` and `role` attributes on the + * interaction element, menu, and list. + * * When opening the `mdcMenuSurface` programmatic, the program is responsible for all of this. + * (including focusing an element of the menu or the menu itself). + * * The `mdcList` will be made focusable by setting a `"tabindex"="-1"` attribute. + * * The `mdcList` will get an `aria-orientation=vertical` attribute. + * * The `mdcList` will get an `aria-hidden=true` attribute when the menu surface is closed. */ @Directive({ - selector: '[mdcMenu]' + selector: '[mdcMenu],[mdcSelectMenu]', + exportAs: 'mdcMenu' }) -export class MdcMenuDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-menu') _cls = true; +export class MdcMenuDirective implements AfterContentInit, OnInit, OnDestroy { + private onDestroy$: Subject = new Subject(); + private onListChange$: Subject = new Subject(); + /** @internal */ + @Output() readonly itemsChanged: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly itemValuesChanged: EventEmitter = new EventEmitter(); + /** @internal */ + @HostBinding('class.mdc-menu') readonly _cls = true; + private _id: string | null = null; + private cachedId: string | null = null; private _function = MdcListFunction.menu; - private _openMemory = false; - private _openFrom: 'tl' | 'tr' | 'bl' | 'br' | null = null; - /** - * Assign an (optional) MdcMenuAnchorDirective. If set the menu - * will position itself relative to this anchor element. The anchor should be - * a direct parent of this menu. - */ - @Input() menuAnchor: MdcMenuAnchorDirective; + private _lastList: MdcListDirective | null= null; + /** * Event emitted when the user selects a value. The passed object contains a value * (set to the value of the selected list item), and an index * (set to the index of the selected list item). */ - @Output() pick: EventEmitter = new EventEmitter(); - /** - * Event emitted when the menu is closed without any selection being made. - */ - @Output() cancel: EventEmitter = new EventEmitter(); - /** - * Event emitted when the menu is opened or closed. - */ - @Output() openChange: EventEmitter = new EventEmitter(); - private _lastList: MdcListDirective; - @ContentChildren(MdcListDirective) _listQuery: QueryList; - private _prevFocus: Element; - private mdcAdapter: MdcMenuAdapter = { - addClass: (className: string) => { - this._rndr.addClass(this._elm.nativeElement, className); - }, - removeClass: (className: string) => { - this._rndr.removeClass(this._elm.nativeElement, className); - }, - hasClass: (className: string) => { - if (CLASS_MENU === className) - return true; - if (CLASS_MENU_OPEN === className) - return this.open; - if (CLASS_TOP_LEFT === className) - return this._openFrom === 'tl'; - if (CLASS_TOP_RIGHT === className) - return this._openFrom === 'tr'; - if (CLASS_BOTTOM_LEFT === className) - return this._openFrom === 'bl'; - if (CLASS_BOTTOM_RIGHT === className) - return this._openFrom === 'br'; - return this._elm.nativeElement.classList.contains(className); - }, - hasNecessaryDom: () => this._listQuery.length != 0, - getAttributeForEventTarget: (target: Element, attrName: string) => target.getAttribute(attrName), - getInnerDimensions: () => { - let elm = this._list._elm.nativeElement; - return {width: elm.offsetWidth, height: elm.offsetHeight}; - }, - hasAnchor: () => this.menuAnchor != null, - getAnchorDimensions: () => { - if (!this.viewport) - return this.menuAnchor._elm.nativeElement.getBoundingClientRect(); - let viewportRect = this.viewport.getBoundingClientRect(); - let anchorRect = this.menuAnchor._elm.nativeElement.getBoundingClientRect(); - return { - bottom: anchorRect.bottom - viewportRect.top, - left: anchorRect.left - viewportRect.left, - right: anchorRect.right - viewportRect.left, - top: anchorRect.top - viewportRect.top, - width: anchorRect.width, - height: anchorRect.height - }; - }, - getWindowDimensions: () => ({ - width: this.viewport ? this.viewport.clientWidth : window.innerWidth, - height: this.viewport ? this.viewport.clientHeight : window.innerHeight - }), - getNumberOfItems: () => this._list._items.length, - registerInteractionHandler: (type: string, handler: EventListener) => { - this._registry.listen(this._rndr, type, handler, this._elm); - }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { - this._registry.unlisten(type, handler); - }, - registerBodyClickHandler: (handler: EventListener) => { - this._registry.listenElm(this._rndr, 'click', handler, document.body); - }, - deregisterBodyClickHandler: (handler: EventListener) => { - this._registry.unlisten('click', handler); - }, - getIndexForEventTarget: (target: EventTarget) => this._list._items.toArray().map(i => i._elm.nativeElement).indexOf(target), - notifySelected: (evtData: {index: number}) => { - this.pick.emit({index: evtData.index, value: this._list._items.toArray()[evtData.index].value}); - // timeout so that the correct open/close value is reported, even if MDCMenu changes it after the event: - window.setTimeout(() => this._onOpenClose(), 0); - }, - notifyCancel: () => { - this.cancel.emit(); - // timeout so that the correct open/close value is reported, even if MDCMenu changes it after the event: - window.setTimeout(() => this._onOpenClose(), 0); - }, - saveFocus: () => { - this._prevFocus = document.activeElement; + @Output() readonly pick: EventEmitter = new EventEmitter(); + /** @internal */ + @ContentChildren(MdcListDirective) _listQuery?: QueryList; + private mdcAdapter: MDCMenuAdapter = { + addClassToElementAtIndex: (index, className) => { + // ignore classes we maintain ourselves + if (!ANGULAR_ITEM_CLASSES.find(c => c === className)) { + const elm = this._list?.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.addClass(elm, className); + } }, - restoreFocus: () => { - if (this._prevFocus) - (this._prevFocus).focus(); + removeClassFromElementAtIndex: (index, className) => { + // ignore classes we maintain ourselves + if (!ANGULAR_ITEM_CLASSES.find(c => c === className)) { + const elm = this._list?.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.addClass(elm, className); + } }, - isFocused: () => document.activeElement === this._elm.nativeElement, - focus: () => { - this._elm.nativeElement.focus(); + addAttributeToElementAtIndex: (index, attr, value) => { + // ignore attributes we maintain ourselves + if (!ANGULAR_ITEM_ATTRIBUTES.find(a => a === attr)) { + const elm = this._list?.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.setAttribute(elm, attr, value); + } }, - getFocusedItemIndex: () => this._list._items.toArray().map(i => i._elm.nativeElement).indexOf(document.activeElement), - focusItemAtIndex: (index: number) => { - this._list._items.toArray()[index]._elm.nativeElement.focus(); + removeAttributeFromElementAtIndex: (index, attr) => { + // ignore attributes we maintain ourselves + if (!ANGULAR_ITEM_ATTRIBUTES.find(a => a === attr)) { + const elm = this._list?.getItem(index)?._elm.nativeElement; + if (elm) + this.rndr.removeAttribute(elm, attr); + } }, - isRtl: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', - setTransformOrigin: (origin: string) => { - this._elm.nativeElement.style[`${getTransformPropertyName(window)}-origin`] = origin; + elementContainsClass: (element, className) => element.classList.contains(className), + closeSurface: (skipRestoreFocus) => { + if (skipRestoreFocus) + this.surface.closeWithoutFocusRestore(); + else + this.surface.open = false; }, - setPosition: (position: {top: string | undefined, right: string | undefined, bottom: string | undefined, left: string | undefined}) => { - let el = this._elm.nativeElement; - this._rndr.setStyle(el, 'left', 'left' in position ? position.left : null); - this._rndr.setStyle(el, 'right', 'right' in position ? position.right : null); - this._rndr.setStyle(el, 'top', 'top' in position ? position.top : null); - this._rndr.setStyle(el, 'bottom', 'bottom' in position ? position.bottom : null); + getElementIndex: (element) => this._list?._items!.toArray().findIndex(i => i._elm.nativeElement === element), + notifySelected: (evtData) => { + this.pick.emit({index: evtData.index, value: this._list._items!.toArray()[evtData.index].value}); }, - setMaxHeight: (value: string) => { - this._elm.nativeElement.style.maxHeight = value; - } + getMenuItemCount: () => this._list?._items!.length || 0, + focusItemAtIndex: (index) => this._list.getItem(index)?._elm.nativeElement.focus(), + focusListRoot: () => this._list?._elm.nativeElement.focus(), + getSelectedSiblingOfItemAtIndex: () => -1, // menuSelectionGroup not yet supported + isSelectableItemAtIndex: () => false // menuSelectionGroup not yet supported }; - private foundation: { - open(arg?: {focusIndex?: number}), - close(event?: Event), - isOpen(): boolean - } = new MDCMenuFoundation(this.mdcAdapter); - // we need an MDCMenu for menus contained inside mdc-select: - public _component: MDCMenu; - - constructor(public _elm: ElementRef, private _rndr: Renderer2, private _registry: MdcEventRegistry) { + private foundation: MDCMenuFoundation | null = null; + + constructor(public _elm: ElementRef, private rndr: Renderer2, @Self() private surface: MdcMenuSurfaceDirective) { + } + + ngOnInit() { + // Force setter to be called in case id was not specified. + this.id = this.id; } ngAfterContentInit() { - this._lastList = this._listQuery.first; - if (this._lastList) { - this._lastList._setFunction(MdcListFunction.menu); - this._onOpenClose(false); - } - this._listQuery.changes.subscribe(() => { - if (this._lastList !== this._listQuery.first) { - this._lastList._setFunction(MdcListFunction.plain); - this._lastList = this._listQuery.first; - if (this._lastList) { - this._lastList._setFunction(MdcListFunction.menu); - this._onOpenClose(false); - if (this._component == null) { - this._component = new MDCMenu(this._elm.nativeElement, this.foundation); - this._component.open = this._openMemory; - } - } else if (this._component) { - this._openMemory = this._component.open; - this._component.destroy(); - this._component = null; - this.foundation = new MDCMenuFoundation(this.mdcAdapter); - } + this._lastList = this._listQuery!.first; + this._listQuery!.changes.subscribe(() => { + if (this._lastList !== this._listQuery!.first) { + this.onListChange$.next(); + this._lastList?._setFunction(MdcListFunction.plain); + this._lastList = this._listQuery!.first; + this.destroyFoundation(); + if (this._lastList) + this.initAll(); } }); + this.surface.afterOpened.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + this.foundation?.handleMenuSurfaceOpened(); + // reset default focus state for programmatic opening of menu; + // interactive opening sets the default when the open is triggered + // (see openAndFocus) + this.foundation?.setDefaultFocusState(DefaultFocusState.NONE); + }); + this.surface.openChange.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + if (this._list) + this._list._hidden = !this.surface.open; + }); if (this._lastList) - // constructing the MDCMenu also initializes the foundation: - this._component = new MDCMenu(this._elm.nativeElement, this.foundation); + this.initAll(); } ngOnDestroy() { - if (this._component) - this._component.destroy(); + this.onListChange$.next(); this.onListChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + this.destroyFoundation(); + } + + private initAll() { + Promise.resolve().then(() => this._lastList!._setFunction(this._function)); + this.initFoundation(); + this.subscribeItemActions(); + this._lastList?.itemsChanged.pipe(takeUntil(this.onListChange$)).subscribe(() => this.itemsChanged.emit()); + this._lastList?.itemValuesChanged.pipe(takeUntil(this.onListChange$)).subscribe(() => this.itemValuesChanged.emit()); } - private _onOpenClose(emit = true) { + private initFoundation() { + this.foundation = new MDCMenuFoundation(this.mdcAdapter); + this.foundation.init(); + // suitable for programmatic opening, program can focus whatever element it wants: + this.foundation.setDefaultFocusState(DefaultFocusState.NONE); if (this._list) - this._list._hidden = !this.open; - if (emit) - this.openChange.emit(this.open); + this._list._hidden = !this.surface.open; } + private destroyFoundation() { + if (this.foundation) { + this.foundation.destroy(); + this.foundation = null; + } + } + + private subscribeItemActions() { + this._lastList?.itemAction.pipe(takeUntil(this.onListChange$)).subscribe(data => { + this.foundation?.handleItemAction(this._list.getItem(data.index)!._elm.nativeElement); + }); + } + + /** @docs-private */ + @HostBinding() + @Input() get id() { + return this._id; + } + + set id(value: string | null) { + this._id = value || this._newId(); + } + + /** @internal */ + _newId(): string { + this.cachedId = this.cachedId || `mdc-menu-${nextId++}`; + return this.cachedId; + } + + /** @docs-private */ + get open() { + return this.surface.open; + } + + /** @docs-private */ + openAndFocus(focus: FocusOnOpen) { + switch (focus) { + case FocusOnOpen.first: + this.foundation?.setDefaultFocusState(DefaultFocusState.FIRST_ITEM); + break; + case FocusOnOpen.last: + this.foundation?.setDefaultFocusState(DefaultFocusState.LAST_ITEM); + break; + case FocusOnOpen.root: + default: + this.foundation?.setDefaultFocusState(DefaultFocusState.LIST_ROOT); + } + this.surface.open = true; + } + + /** @internal */ + doClose() { + this.surface.open = false; + } + + /** @internal */ set _listFunction(val: MdcListFunction) { this._function = val; if (this._lastList) // otherwise this will happen in ngAfterContentInit this._list._setFunction(val); } + /** @internal */ get _list(): MdcListDirective { - return this._listQuery.first; + return this._listQuery!.first; } - - /** - * When this input is defined and does not have value false, the menu will be opened, - * otherwise the menu will be closed. - */ - @Input() @HostBinding('class.mdc-menu--open') - get open() { - return this._component ? this.foundation.isOpen() : this._openMemory; + + /** @internal */ + @HostListener('keydown', ['$event']) _onKeydown(event: KeyboardEvent) { + this.foundation?.handleKeydown(event); } - - set open(val: any) { - let newValue = asBoolean(val); - if (newValue !== this.open) { - this._openMemory = newValue; - if (this._component != null) { - if (newValue) - this.foundation.open(); - else - this.foundation.close(); - } - this._onOpenClose(false); - } +} + +/** + * + * # Accessibility + * + * * `Enter`, `Space`, and `Down Arrow` keys open the menu and place focus on the first item. + * * `Up Arrow` opens the menu and places focus on the last item + * * Click/Touch events set focus to the mdcList root element + * + * * Attribute `role=button` will be set if the element is not already a button element. + * * Attribute `aria-haspopup=menu` will be set if an `mdcMenu` is attached. + * * Attribute `aria-expanded` will be set while the attached menu is open + * * Attribute `aria-controls` will be set to the id of the attached menu. (And a unique id will be generated, + * if none was set on the menu). + * * `Enter`, `Space`, and `Down-Arrow` will open the menu with the first menu item focused. + * * `Up-Arrow` will open the menu with the last menu item focused. + * * Mouse/Touch events will open the menu with the list root element focused. The list root element + * will handle keyboard navigation once it receives focus. + */ +@Directive({ + selector: '[mdcMenuTrigger]', +}) +export class MdcMenuTriggerDirective { + /** @internal */ + @HostBinding('attr.role') _role: string | null = 'button'; + private _mdcMenuTrigger: MdcMenuDirective | null = null; + private down = { + enter: false, + space: false } - /** - * Set this value if you want to customize the direction from which the menu will be opened. - * Note that without this setting the menu will base the direction upon its position in the viewport, - * which is normally the right behavior. Use 'tl' for top-left, 'br' - * for bottom-right, etc. - */ - @Input() - get openFrom(): 'tl' | 'tr' | 'bl' | 'br' | null { - return this._openFrom; + constructor(elm: ElementRef) { + if (elm.nativeElement.nodeName.toUpperCase() === 'BUTTON') + this._role = null; } - set openFrom(val: 'tl' | 'tr' | 'bl' | 'br' | null) { - if (val === 'br' || val === 'bl' || val === 'tr' || val === 'tl') - this._openFrom = val; + /** @internal */ + @HostListener('click') onClick() { + if (this.down.enter || this.down.space) + this._mdcMenuTrigger?.openAndFocus(FocusOnOpen.first); else - this._openFrom = null; + this._mdcMenuTrigger?.openAndFocus(FocusOnOpen.root); } - @HostBinding('class.mdc-menu--open-from-top-left') get _tl() { return this._openFrom === 'tl'; } - @HostBinding('class.mdc-menu--open-from-top-right') get _tr() { return this._openFrom === 'tr'; } - @HostBinding('class.mdc-menu--open-from-bottom-left') get _bl() { return this._openFrom === 'bl'; } - @HostBinding('class.mdc-menu--open-from-bottom-right') get _br() { return this._openFrom === 'br'; } + /** @internal */ + @HostListener('keydown', ['$event']) onKeydown(event: KeyboardEvent) { + this.setDown(event, true); + const {key, keyCode} = event; + if (key === 'ArrowUp' || keyCode === 38) + this._mdcMenuTrigger?.openAndFocus(FocusOnOpen.last); + else if (key === 'ArrowDown' || keyCode === 40) + this._mdcMenuTrigger?.openAndFocus(FocusOnOpen.first); + } - /** - * Assign any HTMLElement to this property to use as the viewport instead of - * the window object. The menu will choose to open the menu from the top or bottom, and - * from the left or right, based on the space available inside the viewport. - * It's normally not needed to set this, and mainly added for the demos and examples. - */ - @Input() viewport: HTMLElement; + /** @internal */ + @HostListener('keyup', ['$event']) onKeyup(event: KeyboardEvent) { + this.setDown(event, false); + } + + /** @internal */ + @HostBinding('attr.aria-haspopup') get _hasPopup() { + return this._mdcMenuTrigger ? 'menu' : null; + } + + /** @internal */ + @HostBinding('attr.aria-expanded') get _expanded() { + return this._mdcMenuTrigger?.open ? 'true' : null; + } + + /** @internal */ + @HostBinding('attr.aria-controls') get _ariaControls() { + return this._mdcMenuTrigger?.id; + } + + @Input() get mdcMenuTrigger() { + return this._mdcMenuTrigger; + } + + set mdcMenuTrigger(value: MdcMenuDirective | null) { + if (value && value.openAndFocus) + this._mdcMenuTrigger = value; + else + this._mdcMenuTrigger = null; + } + + private setDown(event: KeyboardEvent, isDown: boolean) { + const {key, keyCode} = event; + if (key === 'Enter' || keyCode === 13) + this.down.enter = isDown; + else if (key === 'Space' || keyCode === 32) + this.down.space = isDown; + } } + +export const MENU_DIRECTIVES = [ + MdcMenuDirective, MdcMenuTriggerDirective +]; diff --git a/bundle/src/components/notched-outline/mdc.notched-outline.adapter.ts b/bundle/src/components/notched-outline/mdc.notched-outline.adapter.ts deleted file mode 100644 index a30d328..0000000 --- a/bundle/src/components/notched-outline/mdc.notched-outline.adapter.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** @docs-private */ -export interface MdcNotchedOutlineAdapter { - getWidth: () => number; - getHeight: () => number; - addClass: (className: string) => void, - removeClass: (className: string) => void, - setOutlinePathAttr: (value: string) => void, - getIdleOutlineStyleValue: (propertyName: string) => string -} diff --git a/bundle/src/components/notched-outline/mdc.notched-outline.directive.ts b/bundle/src/components/notched-outline/mdc.notched-outline.directive.ts new file mode 100644 index 0000000..a16db07 --- /dev/null +++ b/bundle/src/components/notched-outline/mdc.notched-outline.directive.ts @@ -0,0 +1,117 @@ +import { AfterContentInit, Directive, ElementRef, HostBinding, OnDestroy, Renderer2, ContentChildren, QueryList } from '@angular/core'; +import { MDCNotchedOutlineFoundation, MDCNotchedOutlineAdapter } from '@material/notched-outline'; + +/** + * This directive styles the notch of an `mdcNotchedOutline`. It should wrap the (floating) + * label of an input like `mdcTextField` or `mdcSelect`. + */ +@Directive({ + selector: '[mdcNotchedOutlineNotch]' +}) +export class MdcNotchedOutlineNotchDirective { + /** @internal */ + @HostBinding('class.mdc-notched-outline__notch') readonly _cls = true; + + constructor(public _elm: ElementRef) { + } +} + +/** + * The notched outline is a border around all sides of either an `mdcTextField` or an + * `mdcSelect`. It should only be used for the outlined variant of these inputs. + * This directive should wrap an `mdcNotchedOutlineNotch`, which in turn wraps the + * actual label. + */ +@Directive({ + selector: '[mdcNotchedOutline]' +}) +export class MdcNotchedOutlineDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-notched-outline') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcNotchedOutlineNotchDirective) _notches?: QueryList; + private notchWidth: number | null = null; + private mdcAdapter: MDCNotchedOutlineAdapter = { + addClass: (name) => this.rndr.addClass(this.root.nativeElement, name), + removeClass: (name) => this.rndr.removeClass(this.root.nativeElement, name), + setNotchWidthProperty: (width) => this.rndr.setStyle(this.notch!._elm.nativeElement, 'width', `${width}px`), + removeNotchWidthProperty: () => this.rndr.removeStyle(this.notch!._elm.nativeElement, 'width') + }; + private foundation: MDCNotchedOutlineFoundation | null = null; + + constructor(private rndr: Renderer2, private root: ElementRef) { + this.addSurround('mdc-notched-outline__leading') + } + + ngAfterContentInit() { + this.addSurround('mdc-notched-outline__trailing'); + if (this.notch) + this.initFoundation(); + this._notches!.changes.subscribe(() => { + this.destroyFoundation(); + if (this._notches!.length > 0) + this.initFoundation(); + }); + } + + ngOnDestroy() { + this.destroyFoundation(); + } + + private initFoundation() { + this.foundation = new MDCNotchedOutlineFoundation(this.mdcAdapter); + this.foundation.init(); + if (this.notchWidth) + this.foundation.notch(this.notchWidth); + else + this.foundation.closeNotch(); + } + + private destroyFoundation() { + if (this.foundation) { + this.foundation.destroy(); + this.foundation = null; + } + } + + private addSurround(clazz: string) { + let surround = this.rndr.createElement('span'); + this.rndr.addClass(surround,clazz); + this.rndr.appendChild(this.root.nativeElement, surround); + } + + private get notch() { + return this._notches?.first; + } + + /** + * Opens the notched outline. + * + * @param width The width of the notch. + */ + open(width: number) { + // TODO we actually want to compare the size here as well as the open/closed state (by dropping !! on both sides) + // but this reduces the width of the label when the input has a non-empty value. Needs investigation. + if (!!this.notchWidth !== !!width) { + this.notchWidth = width; + if (this.foundation) + this.foundation.notch(width); + } + } + + /** + * Closes the notched outline. + */ + close() { + if (this.notchWidth != null) { + this.notchWidth = null; + if (this.foundation) + this.foundation.closeNotch(); + } + } +} + +export const NOTCHED_OUTLINE_DIRECTIVES = [ + MdcNotchedOutlineNotchDirective, + MdcNotchedOutlineDirective +]; diff --git a/bundle/src/components/notched-outline/notched-outline.support.ts b/bundle/src/components/notched-outline/notched-outline.support.ts deleted file mode 100644 index 73f100a..0000000 --- a/bundle/src/components/notched-outline/notched-outline.support.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, OnDestroy, Renderer2 } from '@angular/core'; -import { MDCNotchedOutlineFoundation } from '@material/notched-outline'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -import { MdcNotchedOutlineAdapter } from './mdc.notched-outline.adapter'; -import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; - -/** @docs-private */ -export class NotchedOutlineSupport { - private _initialized = false; - private path: SVGPathElement; - private _outline: HTMLElement; - private _outlineIdle: HTMLElement; - private _adapter: MdcNotchedOutlineAdapter = { - getWidth: () => this._outline.offsetWidth, - getHeight: () => this._outline.offsetHeight, - addClass: (className: string) => this._rndr.addClass(this._outline, className), - removeClass: (className: string) => this._rndr.removeClass(this._outline, className), - setOutlinePathAttr: (value: string) => this._rndr.setAttribute(this.path, 'd', value), //, 'svg'), - getIdleOutlineStyleValue: (propertyName: string) => window.getComputedStyle(this._outlineIdle).getPropertyValue(propertyName) - } - private _foundation: { - init(): void, - destroy(): void, - notch(notchWidth: number, isRtl: boolean): void, - closeNotch(): void, - updateSvgPath(notchWidth: number, isRtl: boolean): void - }; - - constructor(private _elm: ElementRef, private _rndr: Renderer2) { - } - - get foundation() { - return this._foundation; - } - - init() { - if (this._foundation == null) { - let path = this._rndr.createElement('path', 'svg'); - this._rndr.addClass(path, 'mdc-notched-outline__path'); - let svg = this._rndr.createElement('svg', 'svg'); - this._rndr.appendChild(svg, path); - this._rndr.appendChild(this._elm.nativeElement, svg); - let outline = this._rndr.createElement('div'); - this._rndr.addClass(outline, 'mdc-notched-outline'); - this._rndr.appendChild(outline, svg); - - let outlineIdle = this._rndr.createElement('div'); - this._rndr.addClass(outlineIdle, 'mdc-notched-outline__idle'); - - this._rndr.appendChild(this._elm.nativeElement, outline); - this._rndr.appendChild(this._elm.nativeElement, outlineIdle); - - this._outline = outline; - this._outlineIdle = outlineIdle; - this.path = path; - this._foundation = new MDCNotchedOutlineFoundation(this._adapter); - this._foundation.init(); - } - } - - destroy() { - if (this._foundation != null) { - try { - this._foundation.destroy(); - this._rndr.removeChild(this._elm.nativeElement, this._outlineIdle); - this._rndr.removeChild(this._elm.nativeElement, this._outline); - } finally { - this._outline = null; - this._outlineIdle = null; - this.path = null; - this._foundation = null; - } - } - } -} diff --git a/bundle/src/components/radio/mdc.radio.adapter.ts b/bundle/src/components/radio/mdc.radio.adapter.ts deleted file mode 100644 index cba9b0f..0000000 --- a/bundle/src/components/radio/mdc.radio.adapter.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** @docs-private */ -export interface MdcRadioAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - getNativeControl: () => HTMLInputElement; -} diff --git a/bundle/src/components/radio/mdc.radio.directive.spec.ts b/bundle/src/components/radio/mdc.radio.directive.spec.ts new file mode 100644 index 0000000..c754d73 --- /dev/null +++ b/bundle/src/components/radio/mdc.radio.directive.spec.ts @@ -0,0 +1,229 @@ +import { TestBed, fakeAsync, ComponentFixture, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { MdcRadioInputDirective, MdcRadioDirective } from './mdc.radio.directive'; +import { hasRipple } from '../../testutils/page.test'; +import { By } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; + +describe('MdcRadioDirective', () => { + it('should render the mdcRadio with ripple and label', fakeAsync(() => { + const { fixture } = setup(); + const root = fixture.nativeElement.querySelector('.mdc-radio'); + expect(root.children.length).toBe(3); + expect(root.children[0].classList).toContain('mdc-radio__native-control'); + expect(root.children[1].classList).toContain('mdc-radio__background'); + expect(root.children[2].classList).toContain('mdc-radio__ripple'); + expect(hasRipple(root)).toBe(true, 'the ripple element should be attached'); + })); + + it('checked can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, elements } = setup(); + expect(testComponent.value).toBe(null); + for (let i in [0, 1, 2]) + expect(elements[i].checked).toBe(false); + setAndCheck(fixture, 'r1', [true, false, false]); + setAndCheck(fixture, 'r2', [false, true, false]); + setAndCheck(fixture, 'r3', [false, false, true]); + setAndCheck(fixture, 'doesnotexist', [false, false, false]); + setAndCheck(fixture, null, [false, false, false]); + setAndCheck(fixture, '', [false, false, false]); + })); + + it('checked can be set by user', fakeAsync(() => { + const { fixture, testComponent, elements, inputs } = setup(); + + elements[1].click(); + tick(); fixture.detectChanges(); + expect(elements.map(e => e.checked)).toEqual([false, true, false]); + expect(testComponent.value).toBe('r2'); + })); + + it('can be disabled', fakeAsync(() => { + const { fixture, testComponent, elements, inputs } = setup(); + + testComponent.disabled = true; + fixture.detectChanges(); + for (let i in [0, 1, 2]) { + expect(elements[i].disabled).toBe(true); + expect(inputs[i].disabled).toBe(true); + } + expect(testComponent.disabled).toBe(true); + const radio = fixture.debugElement.query(By.directive(MdcRadioDirective)).injector.get(MdcRadioDirective); + expect(radio['isRippleSurfaceDisabled']()).toBe(true); + expect(radio['root'].nativeElement.classList).toContain('mdc-radio--disabled'); + + testComponent.disabled = false; + fixture.detectChanges(); + for (let i in [0, 1, 2]) { + expect(elements[i].disabled).toBe(false); + expect(inputs[i].disabled).toBe(false); + } + expect(testComponent.disabled).toBe(false); + expect(radio['isRippleSurfaceDisabled']()).toBe(false); + expect(radio['root'].nativeElement.classList).not.toContain('mdc-radio--disabled'); + })); + + it('native input can be changed dynamically', fakeAsync(() => { + const { fixture, testComponent } = setup(TestComponentDynamicInput); + + let elements = fixture.nativeElement.querySelectorAll('.mdc-radio__native-control'); + // when no input is present the mdcRadio renders without an initialized foundation: + expect(elements.length).toBe(0); + + let check = false; + for (let i = 0; i != 3; ++i) { + // render/include one of the inputs: + testComponent.input = i; + fixture.detectChanges(); + // the input should be recognized, the foundation is (re)initialized, + // so we have a fully functional mdcRadio now: + elements = fixture.nativeElement.querySelectorAll('.mdc-radio__native-control'); + expect(elements.length).toBe(1); + expect(elements[0].classList).toContain('mdc-radio__native-control'); + expect(elements[0].id).toBe(`i${i}`); + // the value of the native input is correctly synced with the testcomponent: + expect(elements[0].checked).toBe(check); + // change the value for the next iteration: + check = !check; + testComponent.checked = check; + fixture.detectChanges(); + expect(elements[0].checked).toBe(check); + } + + // removing input should also work: + testComponent.input = null; + fixture.detectChanges(); + elements = fixture.nativeElement.querySelectorAll('.mdc-radio__native-control'); + // when no input is present the mdcRadio renders without an initialized foundation: + expect(elements.length).toBe(0); + expect(testComponent.checked).toBe(check); + })); + + it('user interactions are registered in the absence of template bindings', fakeAsync(() => { + const { fixture, elements, inputs } = setup(TestComponentNoBinding); + + expect(elements.map(e => e.checked)).toEqual([false, false, false]); + elements[1].click(); + fixture.detectChanges(); + expect(elements.map(e => e.checked)).toEqual([false, true, false]); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expected: boolean[]) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const elements: HTMLInputElement[] = Array.from(fixture.nativeElement.querySelectorAll('.mdc-radio__native-control')); + testComponent.value = value; + fixture.detectChanges(); + expect(elements.map(e => e.checked)).toEqual(expected); + } + + @Component({ + template: ` +
+
+
+ ` + }) + class TestComponent { + value: any = null; + disabled: any = null; + } + + @Component({ + template: ` +
+
+
+ ` + }) + class TestComponentNoBinding { + } + + @Component({ + template: ` +
+ + + +
+ ` + }) + class TestComponentDynamicInput { + input: number = null; + checked: any = null; + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcRadioInputDirective, MdcRadioDirective, compType] + }).createComponent(compType); + fixture.detectChanges(); + const testComponent = fixture.debugElement.injector.get(compType); + const inputs = fixture.debugElement.queryAll(By.directive(MdcRadioInputDirective)).map(i => i.injector.get(MdcRadioInputDirective)); + const elements: HTMLInputElement[] = Array.from(fixture.nativeElement.querySelectorAll('.mdc-radio__native-control')); + return { fixture, testComponent, inputs, elements }; + } +}); + +describe('MdcRadioDirective with FormsModule', () => { + it('ngModel can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, elements } = setup(); + expect(testComponent.value).toBe(null); + for (let i in [0, 1, 2]) + expect(elements[i].checked).toBe(false); + setAndCheck(fixture, 'r1', [true, false, false]); + setAndCheck(fixture, 'r2', [false, true, false]); + setAndCheck(fixture, 'r3', [false, false, true]); + setAndCheck(fixture, 'doesnotexist', [false, false, false]); + setAndCheck(fixture, null, [false, false, false]); + setAndCheck(fixture, '', [false, false, false]); + })); + + it('ngModel can be changed by user', fakeAsync(() => { + const { fixture, testComponent, elements, inputs } = setup(); + + expect(elements.map(e => e.checked)).toEqual([false, false, false]); + expect(testComponent.value).toBe(null); + + elements[0].click(); + fixture.detectChanges(); + expect(elements.map(e => e.checked)).toEqual([true, false, false]); + expect(testComponent.value).toBe('r1'); + + elements[2].click(); + fixture.detectChanges(); + expect(elements.map(e => e.checked)).toEqual([false, false, true]); + expect(testComponent.value).toBe('r3'); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expected: boolean[]) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const elements: HTMLInputElement[] = Array.from(fixture.nativeElement.querySelectorAll('.mdc-radio__native-control')); + testComponent.value = value; + fixture.detectChanges(); flush(); + expect(elements.map(e => e.checked)).toEqual(expected); + } + + @Component({ + template: ` +
+
+
+ ` + }) + class TestComponent { + value: any = null; + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + imports: [FormsModule], + declarations: [MdcRadioInputDirective, MdcRadioDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); + tick(); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const inputs = fixture.debugElement.queryAll(By.directive(MdcRadioInputDirective)).map(i => i.injector.get(MdcRadioInputDirective)); + const elements: HTMLInputElement[] = Array.from(fixture.nativeElement.querySelectorAll('.mdc-radio__native-control')); + return { fixture, testComponent, inputs, elements }; + } +}); diff --git a/bundle/src/components/radio/mdc.radio.directive.ts b/bundle/src/components/radio/mdc.radio.directive.ts index 864b011..5c28fb2 100644 --- a/bundle/src/components/radio/mdc.radio.directive.ts +++ b/bundle/src/components/radio/mdc.radio.directive.ts @@ -1,9 +1,9 @@ -import { AfterContentInit, Component, ContentChild, Directive, ElementRef, EventEmitter, HostBinding, HostListener, - Input, OnDestroy, OnInit, Optional, Output, Provider, Renderer2, Self, ViewChild, ViewEncapsulation, forwardRef } from '@angular/core'; +import { AfterContentInit, Directive, ElementRef, HostBinding, + Input, OnDestroy, Optional, Renderer2, Self, forwardRef, ContentChildren, QueryList, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { NgControl } from '@angular/forms'; -import { MDCRadioFoundation } from '@material/radio'; +import { MDCRadioFoundation, MDCRadioAdapter } from '@material/radio'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { MdcRadioAdapter } from './mdc.radio.adapter'; import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; import { asBoolean } from '../../utils/value.utils'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; @@ -16,8 +16,9 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcRadioInputDirective) }] }) export class MdcRadioInputDirective extends AbstractMdcInput { - @HostBinding('class.mdc-radio__native-control') _cls = true; - private _id: string; + /** @internal */ + @HostBinding('class.mdc-radio__native-control') readonly _cls = true; + private _id: string | null = null; private _disabled = false; constructor(public _elm: ElementRef, @Optional() @Self() public _cntr: NgControl) { @@ -30,19 +31,21 @@ export class MdcRadioInputDirective extends AbstractMdcInput { return this._id; } - set id(value: string) { + set id(value: string | null) { this._id = value; } /** @docs-private */ @HostBinding() @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; + return this._cntr ? !!this._cntr.disabled : this._disabled; } - set disabled(value: any) { + set disabled(value: boolean) { this._disabled = asBoolean(value); } + + static ngAcceptInputType_disabled: boolean | ''; } /** @@ -56,38 +59,43 @@ export class MdcRadioInputDirective extends AbstractMdcInput { * * This directive can be used together with an mdcFormField to * easily position radio buttons and their labels, see - * mdcFormField. + * mdcFormField. */ @Directive({ selector: '[mdcRadio]' }) export class MdcRadioDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-radio') _cls = true; - @ContentChild(MdcRadioInputDirective) _input: MdcRadioInputDirective; - private mdcAdapter: MdcRadioAdapter = { - addClass: (className: string) => { - this.renderer.addClass(this.root.nativeElement, className); - }, - removeClass: (className: string) => { - this.renderer.removeClass(this.root.nativeElement, className); - }, - getNativeControl: () => this._input ? this._input._elm.nativeElement : null + /** @internal */ + @HostBinding('class.mdc-radio') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcRadioInputDirective) _inputs?: QueryList; + private mdcAdapter: MDCRadioAdapter = { + // We can just ignore all adapter calls, since we have a HostBinding for the + // disabled classes, and never call foundation.setDisabled + addClass: () => undefined, + removeClass: () => undefined, + setNativeControlDisabled: () => undefined }; - private foundation: { init: Function, destroy: Function } = new MDCRadioFoundation(this.mdcAdapter); + private foundation: MDCRadioFoundation | null = new MDCRadioFoundation(this.mdcAdapter); - constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry) { - super(root, renderer, registry); + constructor(private renderer: Renderer2, private root: ElementRef, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(root, renderer, registry, doc as Document); } ngAfterContentInit() { this.addBackground(); - this.initRipple(); - this.foundation.init(); + this.addRippleSurface('mdc-radio__ripple'); + this.initRipple(true); + this.foundation!.init(); + this._inputs!.changes.subscribe(() => { + this.reinitRipple(); + }); } ngOnDestroy() { this.destroyRipple(); - this.foundation.destroy(); + this.foundation?.destroy(); + this.foundation = null; } private addBackground() { @@ -102,17 +110,12 @@ export class MdcRadioDirective extends AbstractMdcRipple implements AfterContent this.renderer.appendChild(this.root.nativeElement, bg); } - /** @docs-private */ + /** @internal */ protected getRippleInteractionElement() { - return this._input ? this._input._elm : null; - } - - /** @docs-private */ - isRippleUnbounded() { - return true; + return this._input?._elm; } - /** @docs-private */ + /** @internal */ isRippleSurfaceActive() { // This is what the @material/radio MDCRadio component does, with the following comment: // "Radio buttons technically go 'active' whenever there is *any* keyboard interaction. @@ -120,7 +123,20 @@ export class MdcRadioDirective extends AbstractMdcRipple implements AfterContent return false; } + // instead of calling foundation.setDisabled on disabled state changes, we just + // bind the class to the property: + /** @internal */ @HostBinding('class.mdc-radio--disabled') get _disabled() { return this._input == null || this._input.disabled; } + + /** @internal */ + get _input() { + return this._inputs && this._inputs.length > 0 ? this._inputs.first : null; + } } + +export const RADIO_DIRECTIVES = [ + MdcRadioInputDirective, + MdcRadioDirective +]; diff --git a/bundle/src/components/ripple/abstract.mdc.ripple.ts b/bundle/src/components/ripple/abstract.mdc.ripple.ts index 9338e70..1247190 100644 --- a/bundle/src/components/ripple/abstract.mdc.ripple.ts +++ b/bundle/src/components/ripple/abstract.mdc.ripple.ts @@ -1,60 +1,62 @@ -import { - ElementRef, - Renderer2 -} from '@angular/core'; -import { MDCRippleFoundation, util } from '@material/ripple'; -import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; -import { MdcRippleAdapter } from './mdc.ripple.adapter'; +import { ElementRef, Renderer2, HostListener, Directive } from '@angular/core'; +import { MDCRippleFoundation, MDCRippleAdapter, util } from '@material/ripple'; +import { events } from '@material/dom'; +import { ponyfill } from '@material/dom'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -// cast to correct type (string); getMatchesProperty is annotated as returning string[], but it does actually return a string: -const matchesProperty: string = util.getMatchesProperty(HTMLElement.prototype); - /** @docs-private */ +@Directive() export abstract class AbstractMdcRipple { - private mdcRippleAdapter: MdcRippleAdapter = { - browserSupportsCssVars: () => util.supportsCssVariables(window), - isUnbounded: () => this.isRippleUnbounded(), + private mdcRippleAdapter: MDCRippleAdapter = { + browserSupportsCssVars: () => util.supportsCssVariables(this.document.defaultView!), + isUnbounded: () => this._unbounded, isSurfaceActive: () => this.isRippleSurfaceActive(), isSurfaceDisabled: () => this.isRippleSurfaceDisabled(), - addClass: (className: string) => this.addClassToRipple(className), - removeClass: (className: string) => this.removeClassFromRipple(className), - containsEventTarget: (target: EventTarget) => this._rippleElm.nativeElement.contains(target), - registerInteractionHandler: (type: string, handler: EventListener) => { - this._registry.listenElm(this._renderer, type, handler, this.getRippleInteractionElement().nativeElement, util.applyPassive()); + addClass: (className) => this.addClassToRipple(className), + removeClass: (className) => this.removeClassFromRipple(className), + containsEventTarget: (target) => this._rippleElm.nativeElement.contains(target), + registerInteractionHandler: (type, handler) => { + if (this.getRippleInteractionElement()) + this._registry.listenElm(this._renderer, type, handler, this.getRippleInteractionElement()!.nativeElement, events.applyPassive()); }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { + deregisterInteractionHandler: (type, handler) => { this._registry.unlisten(type, handler); }, - registerDocumentInteractionHandler: (type: string, handler: EventListener) => this._registry.listenElm(this._renderer, type, handler, document), - deregisterDocumentInteractionHandler: (type: string, handler: EventListener) => this._registry.unlisten(type, handler), - registerResizeHandler: (handler: EventListener) => { - this._registry.listenElm(this._renderer, 'resize', handler, window); + registerDocumentInteractionHandler: (type, handler) => this._registry.listenElm(this._renderer, type, handler, this.document, events.applyPassive()), + deregisterDocumentInteractionHandler: (type, handler) => this._registry.unlisten(type, handler), + registerResizeHandler: (handler) => { + this._registry.listenElm(this._renderer, 'resize', handler, this.document.defaultView!); }, - deregisterResizeHandler: (handler: EventListener) => { + deregisterResizeHandler: (handler) => { this._registry.unlisten('resize', handler); }, - updateCssVariable: (name: string, value: string) => { this._rippleElm.nativeElement.style.setProperty(name, value); }, + updateCssVariable: (name, value) => { this.getRippleStylingElement().nativeElement.style.setProperty(name, value); }, computeBoundingRect: () => this.computeRippleBoundingRect(), - getWindowPageOffset: () => ({x: window.pageXOffset, y: window.pageYOffset}) + getWindowPageOffset: () => ({x: this.document.defaultView!.pageXOffset, y: this.document.defaultView!.pageYOffset}) } - protected _rippleFoundation: { - init(), - destroy(), - activate(event?: Event), - deactivate(event?: Event), - layout() - }; - constructor(protected _rippleElm: ElementRef, protected _renderer: Renderer2, protected _registry: MdcEventRegistry) {} + /** @internal */ + protected _rippleFoundation: MDCRippleFoundation | null = null; + private _unbounded = false; + private _rippleSurface: HTMLElement | null = null; + protected document: Document; + + constructor(protected _rippleElm: ElementRef, protected _renderer: Renderer2, protected _registry: MdcEventRegistry, + doc: any) { + // workaround compiler bug when using ViewEngine. Type Document fails compilation + this.document = doc as Document + } - protected initRipple() { + /** @internal */ + protected initRipple(unbounded = false) { if (this._rippleFoundation) throw new Error('initRipple() is called multiple times'); + this._unbounded = unbounded; this._rippleFoundation = new MDCRippleFoundation(this.mdcRippleAdapter); this._rippleFoundation.init(); } + /** @internal */ protected destroyRipple() { if (this._rippleFoundation) { this._rippleFoundation.destroy(); @@ -62,10 +64,40 @@ export abstract class AbstractMdcRipple { } } + /** @internal */ + protected reinitRipple() { + if (this._rippleFoundation) { + this.destroyRipple(); + this.initRipple(this._unbounded); + } + } + + /** @internal */ protected isRippleInitialized() { return this._rippleFoundation != null; } + /** @internal */ + protected addRippleSurface(clazz: string, firstElement = false) { + this.destroyRippleSurface(); + this._rippleSurface = this._renderer.createElement('div'); + this._renderer.addClass(this._rippleSurface, clazz); + if (firstElement && this._rippleElm.nativeElement.children.length > 0) { + const firstChild = this._rippleElm.nativeElement.children.item(0); + this._renderer.insertBefore(this._rippleElm.nativeElement, this._rippleSurface, firstChild); + } else + this._renderer.appendChild(this._rippleElm.nativeElement, this._rippleSurface); + return this._rippleSurface; + } + + /** @internal */ + protected destroyRippleSurface() { + if (this._rippleSurface) { + this._renderer.removeChild(this._rippleElm.nativeElement, this._rippleSurface); + this._rippleSurface = null; + } + } + activateRipple() { if (this._rippleFoundation) this._rippleFoundation.activate(); @@ -76,41 +108,77 @@ export abstract class AbstractMdcRipple { this._rippleFoundation.deactivate(); } - protected getRippleInteractionElement() { + layout() { + if (this._rippleFoundation) + this._rippleFoundation.layout(); + } + + protected get rippleSurface() { + return new ElementRef(this._rippleSurface); + } + + protected getRippleInteractionElement(): ElementRef | undefined { return this._rippleElm; } - protected isRippleUnbounded() { - return false; + protected getRippleStylingElement() { + return this._rippleElm; + } + + protected isRippleUnbounded(): boolean { + return this._unbounded; + } + + /** @internal */ + protected setRippleUnbounded(value: boolean) { + if (!!value !== this._unbounded) { + this._unbounded = !!value; + // despite what the documentation seems to indicate, you can't + // just change the unbounded property of an already initialized + // ripple. The initialization registers different handlers, and won't + // change those registrations when you change the unbounded property. + // Hence we destroy and re-init the whole thing: + this.reinitRipple(); + } } protected isRippleSurfaceActive() { let interactionElm = this.getRippleInteractionElement(); - if (interactionElm == null) - return false; - return this.isActiveElement(interactionElm.nativeElement); + return !!interactionElm && this.isActiveElement(interactionElm.nativeElement); } protected isActiveElement(element: HTMLElement) { - return element == null ? false : element[matchesProperty](':active'); + return element == null ? false : ponyfill.matches(element, ':active'); } protected isRippleSurfaceDisabled() { let interactionElm = this.getRippleInteractionElement(); - if (interactionElm == null) - return true; - return !!interactionElm.nativeElement.attributes.getNamedItem('disabled'); + return !!interactionElm && !!interactionElm.nativeElement.attributes.getNamedItem('disabled'); } + /** @internal */ protected addClassToRipple(name: string) { - this._renderer.addClass(this._rippleElm.nativeElement, name); + this._renderer.addClass(this.getRippleStylingElement().nativeElement, name); } + /** @internal */ protected removeClassFromRipple(name: string) { - this._renderer.removeClass(this._rippleElm.nativeElement, name); + this._renderer.removeClass(this.getRippleStylingElement().nativeElement, name); } protected computeRippleBoundingRect() { return this._rippleElm.nativeElement.getBoundingClientRect(); } + + /** @internal */ + @HostListener('focusin') onFocus() { + if (this._rippleFoundation) + this._rippleFoundation.handleFocus(); + } + + /** @internal */ + @HostListener('focusout') onBlur() { + if (this._rippleFoundation) + this._rippleFoundation.handleBlur(); + } } diff --git a/bundle/src/components/ripple/mdc.ripple.adapter.ts b/bundle/src/components/ripple/mdc.ripple.adapter.ts deleted file mode 100644 index 807b6d0..0000000 --- a/bundle/src/components/ripple/mdc.ripple.adapter.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** @docs-private */ -export interface MdcRippleAdapter { - browserSupportsCssVars: () => boolean; - isUnbounded: () => boolean; - isSurfaceActive: () => boolean; - isSurfaceDisabled: () => boolean; - addClass: (className: string) => void; - removeClass: (className: string) => void; - containsEventTarget: (target: EventTarget) => boolean; - registerInteractionHandler: (type: string, handler: EventListener) => void; - deregisterInteractionHandler: (type: string, handler: EventListener) => void; - registerDocumentInteractionHandler: (type: string, handler: EventListener) => void; - deregisterDocumentInteractionHandler: (type: string, handler: EventListener) => void; - registerResizeHandler: (handler: EventListener) => void; - deregisterResizeHandler: (handler: EventListener) => void; - updateCssVariable: (name: string, value: number | string) => void; - computeBoundingRect: () => ClientRect; - getWindowPageOffset: () => {x: number, y: number}; -} diff --git a/bundle/src/components/ripple/mdc.ripple.directive.spec.ts b/bundle/src/components/ripple/mdc.ripple.directive.spec.ts new file mode 100644 index 0000000..d810879 --- /dev/null +++ b/bundle/src/components/ripple/mdc.ripple.directive.spec.ts @@ -0,0 +1,207 @@ +import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { MDCRippleFoundation, MDCRippleAdapter } from '@material/ripple'; +import { MdcRippleDirective } from './mdc.ripple.directive'; +import { testStyle, hasRipple } from '../../testutils/page.test'; +import { spyOnAll } from '../../testutils/util'; + +describe('MdcRippleDirective', () => { + it('should attach the ripple effect', fakeAsync(() => { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcRippleDirective, SimpleTestComponent] + }).createComponent(SimpleTestComponent); + fixture.detectChanges(); + const div = fixture.nativeElement.querySelector('div'); + expect(hasRipple(div)).toBe(true, 'mdcRipple should attach the mdc-ripple-upgraded class'); + })); + + it('on/off can be set programmatically', fakeAsync(() => { + const { fixture } = setup(); + testStyle(fixture, 'ripple', 'mdcRipple', 'mdc-ripple-upgraded', MdcRippleDirective, TestComponent, () => {tick(20); }); + })); + + it('can be disabled programmatically', fakeAsync(() => { + const { fixture, button, testComponent, ripple } = setupEnabled(); + expect(ripple['isRippleSurfaceDisabled']()).toBe(false); + button.disabled = true; + expect(ripple['isRippleSurfaceDisabled']()).toBe(true); + testComponent.disabled = false; + fixture.detectChanges(); + expect(ripple['isRippleSurfaceDisabled']()).toBe(false); + button.disabled = false; + testComponent.disabled = true; + fixture.detectChanges(); + expect(ripple['isRippleSurfaceDisabled']()).toBe(true); + testComponent.disabled = null; + fixture.detectChanges(); + expect(ripple['isRippleSurfaceDisabled']()).toBe(false); + })); + + it('can be made (un)bounded programmatically', fakeAsync(() => { + const { fixture } = setupEnabled(); + testStyle(fixture, 'unbounded', 'unbounded', 'mdc-ripple-upgraded--unbounded', MdcRippleDirective, TestComponent, () => {tick(20); }); + })); + + it('dimension can be changed', fakeAsync(() => { + const { fixture, button, testComponent, ripple } = setupEnabled(); + + testComponent.dimension = "150"; + fixture.detectChanges(); + expect(ripple.dimension).toBe(150); + const {left, top} = button.getBoundingClientRect(); + expect(ripple['computeRippleBoundingRect']()).toEqual({ + left, + top, + width: 150, + height: 150, + right: left + 150, + bottom: top + 150 + }); + })); + + it('dimension can be changed', fakeAsync(() => { + const { fixture, button, testComponent, ripple } = setupEnabled(); + + testComponent.dimension = "150"; + fixture.detectChanges(); + expect(ripple.dimension).toBe(150); + const {left, top} = button.getBoundingClientRect(); + expect(ripple['computeRippleBoundingRect']()).toEqual({ + left, + top, + width: 150, + height: 150, + right: left + 150, + bottom: top + 150 + }); + })); + + it('surface can be anabled, disabled, or set to primary or accent', fakeAsync(() => { + const { fixture, button, testComponent, ripple } = setupEnabled(); + + expect(button.classList).toContain('mdc-ripple-surface'); + expect(button.classList).not.toContain('mdc-ripple-surface--primary'); + expect(button.classList).not.toContain('mdc-ripple-surface--accent'); + + testComponent.surface = 'primary'; + fixture.detectChanges(); + expect(button.classList).toContain('mdc-ripple-surface'); + expect(button.classList).toContain('mdc-ripple-surface--primary'); + expect(button.classList).not.toContain('mdc-ripple-surface--accent'); + + testComponent.surface = false; + fixture.detectChanges(); + expect(button.classList).not.toContain('mdc-ripple-surface'); + expect(button.classList).not.toContain('mdc-ripple-surface--primary'); + expect(button.classList).not.toContain('mdc-ripple-surface--accent'); + })); + + it('focus and blur events are passed to foundation', fakeAsync(() => { + const { button, foundation } = setupEnabled(); + expect(foundation.handleBlur).not.toHaveBeenCalled(); + expect(foundation.handleFocus).not.toHaveBeenCalled(); + button.dispatchEvent(new Event('focus')); + tick(); + expect(foundation.handleBlur).not.toHaveBeenCalled(); + expect(foundation.handleFocus).toHaveBeenCalled(); + button.dispatchEvent(new Event('blur')); + tick(); + expect(foundation.handleBlur).toHaveBeenCalled(); + expect(foundation.handleFocus).toHaveBeenCalled(); + })); + + it('can be activated', fakeAsync(() => { + const { button, adapter } = setupEnabled(); + (adapter.computeBoundingRect).calls.reset(); + (adapter.addClass).calls.reset(); + (adapter.removeClass).calls.reset(); + button.dispatchEvent(new Event('mousedown')); + tick(5); + expect(adapter.computeBoundingRect).toHaveBeenCalled(); + expect(adapter.addClass).toHaveBeenCalledWith('mdc-ripple-upgraded--foreground-activation'); + expect(adapter.removeClass).toHaveBeenCalledWith('mdc-ripple-upgraded--foreground-activation'); + tick(300); // wait for all animation frames / queued timers + })); + + it('can be programmatically activated/deactivated', fakeAsync(() => { + const { ripple, foundation, adapter } = setupEnabled(); + (adapter.computeBoundingRect).calls.reset(); + (adapter.addClass).calls.reset(); + (adapter.removeClass).calls.reset(); + ripple.activateRipple(); + tick(5); + expect(foundation.activate).toHaveBeenCalled(); + expect(adapter.computeBoundingRect).toHaveBeenCalled(); + expect(adapter.addClass).toHaveBeenCalledWith('mdc-ripple-upgraded--foreground-activation'); + expect(adapter.removeClass).toHaveBeenCalledWith('mdc-ripple-upgraded--foreground-activation'); + (adapter.addClass).calls.reset(); + (adapter.removeClass).calls.reset(); + ripple.deactivateRipple(); + expect(foundation.deactivate).toHaveBeenCalled(); + tick(400); // wait for all animation frames / queued timers + })); + + it('initRipple must not be called when already initialized', fakeAsync(() => { + const { ripple } = setupEnabled(); + expect(ripple['isRippleInitialized']()).toBeTrue(); + expect(() => { + ripple['initRipple'](); + }).toThrowError('initRipple() is called multiple times'); + })); + + it('isRippleSurfaceActive default implementation', fakeAsync(() => { + const { button, ripple } = setupEnabled(); + expect(ripple['isRippleSurfaceActive']()).toBeFalse(); + button.matches = (selector) => selector === ':active'; + expect(ripple['isRippleSurfaceActive']()).toBeTrue(); + })); + + @Component({ + template: ` +
ripple
+ ` + }) + class SimpleTestComponent { + } + + @Component({ + template: ` + + ` + }) + class TestComponent { + ripple: any = null; + disabled: any = null; + unbounded: any = null; + dimension: any = null; + surface: any = true; + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcRippleDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); + return { fixture }; + } + + function setupEnabled() { + const { fixture } = setup(); + const button = fixture.nativeElement.querySelector('button'); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const ripple = fixture.debugElement.query(By.directive(MdcRippleDirective)).injector.get(MdcRippleDirective); + // spy-on adapter, before it's used to initialize the foundation (otherwise spies will never be called): + let adapter: MDCRippleAdapter = ripple['mdcRippleAdapter']; + spyOnAll(adapter); + // enable the ripple: + testComponent.ripple = true; + fixture.detectChanges(); + tick(20); + // attach some spies: + let foundation: MDCRippleFoundation = ripple['_rippleFoundation']; + spyOnAll(foundation); + + return { fixture, button, testComponent, ripple, foundation, adapter }; + } +}); diff --git a/bundle/src/components/ripple/mdc.ripple.directive.ts b/bundle/src/components/ripple/mdc.ripple.directive.ts index 11d70e4..4a3de33 100644 --- a/bundle/src/components/ripple/mdc.ripple.directive.ts +++ b/bundle/src/components/ripple/mdc.ripple.directive.ts @@ -1,7 +1,5 @@ -import { AfterContentInit, Directive, ElementRef, HostBinding, - Input, OnDestroy, Renderer2 } from '@angular/core'; -import { MDCRipple } from '@material/ripple'; -import { MDCRippleFoundation } from '@material/ripple'; +import { AfterContentInit, Directive, ElementRef, HostBinding, Input, OnDestroy, Renderer2, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; @@ -19,13 +17,12 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; export class MdcRippleDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { private _initialized = false; private _on = false; - private _disabled: boolean = null; - private _unbounded = false; - private _surface = false; - private _dim = null; + private _disabled: boolean | null = null; + private _surface: boolean | 'primary' | 'accent' = false; + private _dim: number | null = null; - constructor(private elm: ElementRef, private renderer: Renderer2, private registry: MdcEventRegistry) { - super(elm, renderer, registry); + constructor(public _elm: ElementRef, renderer: Renderer2, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_elm, renderer, registry, doc as Document); } ngAfterContentInit() { @@ -38,28 +35,23 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten this.destroyRipple(); } - /** @docs-private */ - protected isRippleUnbounded() { - return this._unbounded; - } - - /** @docs-private */ + /** @internal */ protected isRippleSurfaceDisabled() { return this._disabled == null ? super.isRippleSurfaceDisabled() : this._disabled; } - /** @docs-private */ + /** @internal */ protected computeRippleBoundingRect() { if (this._dim == null) return super.computeRippleBoundingRect(); - const {left, top} = this.elm.nativeElement.getBoundingClientRect(); + const {left, top} = this._elm.nativeElement.getBoundingClientRect(); return { left, top, width: this._dim, height: this._dim, right: left + this._dim, - bottom: left + this._dim, + bottom: top + this._dim, }; } @@ -67,11 +59,11 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten * Set this input to false to remove the ripple effect from the surface. */ @Input() get mdcRipple() { - return !this._on; + return this._on; } - set mdcRipple(value: any) { - let newValue = asBoolean(value); + set mdcRipple(value: boolean) { + const newValue = asBoolean(value); if (newValue !== this._on) { this._on = newValue; if (this._initialized) { @@ -83,25 +75,26 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten } } + static ngAcceptInputType_mdcRipple: boolean | ''; + /** * When this input has a value other than false, the ripple is unbounded. * Surfaces for bounded ripples should have overflow set to hidden, * while surfaces for unbounded ripples should have it set to visible. */ @Input() get unbounded() { - return this._unbounded; + return this.isRippleUnbounded(); } - set unbounded(value: any) { - let newValue = asBoolean(value); - if (newValue !== this._unbounded) { - this._unbounded = newValue; - this.reInit(); - } + set unbounded(value: boolean) { + this.setRippleUnbounded(asBoolean(value)); } + static ngAcceptInputType_unbounded: boolean | ''; + + /** @internal */ @HostBinding('attr.data-mdc-ripple-is-unbounded') get _attrUnbounded() { - return this._unbounded ? "" : null; + return this.unbounded ? "" : null; } /** @@ -113,11 +106,13 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten return this._dim; } - set dimension(value: string | number) { + set dimension(value: number | null) { this._dim = value == null ? null : +value; this.layout(); } + static ngAcceptInputType_dimension: string | number | null; + /** * This input can be used to programmatically enable/disable the ripple. * When true, the ripple effect will be disabled, when false the ripple @@ -129,10 +124,12 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten return this._disabled; } - set disabled(value: any) { + set disabled(value: boolean | null) { this._disabled = asBooleanOrNull(value); } + static ngAcceptInputType_boolean: boolean | null | ''; + /** * When this input has a value other than false, the ripple element will get the * "mdc-ripple-surface" class. That class has styling for bounded and unbounded @@ -140,25 +137,28 @@ export class MdcRippleDirective extends AbstractMdcRipple implements AfterConten * you have to supply your own ripple styles, using the provided * Sass Mixins. + * + * To apply a standard surface ripple, set the value to `true`, `"primary"`, or `"accent"`. + * The values primary and accent set the ripple color to the theme primary or secondary color. */ @Input() @HostBinding('class.mdc-ripple-surface') get surface() { - return this._surface; + return !!this._surface; } - set surface(value: any) { - this._surface = asBoolean(value); + set surface(value: boolean | 'primary' | 'accent') { + if (value === 'primary' || value === 'accent') + this._surface = value; + else + this._surface = asBoolean(value); } - private reInit() { - if (this._initialized && this.isRippleInitialized()) { - this.destroyRipple(); - this.initRipple(); - } + static ngAcceptInputType_surface: boolean | 'primary' | 'accent' | ''; + + @HostBinding('class.mdc-ripple-surface--primary') get _surfacePrimary() { + return this._surface === 'primary'; } - private layout() { - if (this._initialized && this.isRippleInitialized()) { - this._rippleFoundation.layout(); - } + @HostBinding('class.mdc-ripple-surface--accent') get _surfaceAccent() { + return this._surface === 'accent'; } } diff --git a/bundle/src/components/select/mdc.select.adapter.ts b/bundle/src/components/select/mdc.select.adapter.ts deleted file mode 100644 index 7e68a11..0000000 --- a/bundle/src/components/select/mdc.select.adapter.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** @docs-private */ -export interface MdcSelectAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - floatLabel: (value: boolean) => void, - activateBottomLine: () => void, - deactivateBottomLine: () => void, - registerInteractionHandler: (type: string, handler: EventListener) => void, - deregisterInteractionHandler: (type: string, handler: EventListener) => void, - getSelectedIndex: () => number, - setSelectedIndex: (index: number) => void, - setDisabled: (disabled: boolean) => void, - getValue: () => string, - setValue: (value: string) => void, - isRtl: () => boolean, - hasLabel: () => boolean, - getLabelWidth: () => number, - hasOutline: () => {}, - notchOutline: (labelWidth: number, isRtl: boolean) => void, - closeOutline: () => void -} diff --git a/bundle/src/components/select/mdc.select.directive.spec.ts b/bundle/src/components/select/mdc.select.directive.spec.ts new file mode 100644 index 0000000..86f0ce5 --- /dev/null +++ b/bundle/src/components/select/mdc.select.directive.spec.ts @@ -0,0 +1,394 @@ +import { TestBed, fakeAsync, ComponentFixture, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { MdcFloatingLabelDirective } from '../floating-label/mdc.floating-label.directive'; +import { SELECT_DIRECTIVES, MdcSelectDirective } from './mdc.select.directive'; +import { MENU_DIRECTIVES } from '../menu/mdc.menu.directive'; +import { LIST_DIRECTIVES } from '../list/mdc.list.directive'; +import { MENU_SURFACE_DIRECTIVES } from '../menu-surface/mdc.menu-surface.directive'; +import { NOTCHED_OUTLINE_DIRECTIVES } from '../notched-outline/mdc.notched-outline.directive'; +import { hasRipple, simulateKey } from '../../testutils/page.test'; +import { By } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; + +// TODO: test disabled options +// TODO: test structure when surface open +// TODO: test structure when required +// TODO: test mdcSelect with FormsModule + +describe('MdcSelectDirective', () => { + it('filled: test DOM, aria properties, and ripple', fakeAsync(() => { + const { fixture, testComponent } = setup(TestStaticComponent); + const root = fixture.nativeElement.querySelector('.mdc-select'); + const { anchor } = validateDom(root); + expect(hasRipple(anchor)).toBe(true, 'the ripple element should be attached to the anchor'); + + testComponent.disabled = true; + fixture.detectChanges(); tick(5); + validateDom(root, {disabled: true}); + + testComponent.labeled = false; testComponent.disabled = false; + fixture.detectChanges(); tick(5); + validateDom(root, {labeled: false}); + })); + + it('outlined: test DOM, aria properties, and ripple', fakeAsync(() => { + const { fixture, testComponent } = setup(TestStaticOutlinedComponent); + const root = fixture.nativeElement.querySelector('.mdc-select'); + const { anchor } = validateDom(root, {outlined: true}); + expect(hasRipple(anchor)).toBe(false, 'no ripple allowed for outlined variant'); + + testComponent.disabled = true; + fixture.detectChanges(); tick(5); + validateDom(root, {outlined: true, disabled: true}); + + testComponent.labeled = false; testComponent.disabled = false; + fixture.detectChanges(); tick(5); + validateDom(root, {outlined: true, labeled: false}); + })); + + it('filled: floating label must float when input has focus', fakeAsync(() => { + const { fixture } = setup(TestStaticComponent); + validateFloatOnFocus(fixture); + })); + + it('outlined: floating label must float when input has focus', fakeAsync(() => { + const { fixture } = setup(TestStaticOutlinedComponent); + validateFloatOnFocus(fixture); + })); + + it('value can be changed programmatically', fakeAsync(() => { + const { fixture, testComponent } = setup(TestStaticComponent); + + expect(testComponent.value).toBe(null); + setAndCheck(fixture, 'vegetables', TestStaticComponent); + setAndCheck(fixture, '', TestStaticComponent); + setAndCheck(fixture, 'fruit', TestStaticComponent); + setAndCheck(fixture, null, TestStaticComponent); + setAndCheck(fixture, 'invalid', TestStaticComponent); + })); + + it('value can be changed by user', fakeAsync(() => { + const { fixture, testComponent } = setup(); + + expect(testComponent.value).toBe(null); + selectAndCheck(fixture, 0, 2, 'vegetables'); + selectAndCheck(fixture, 2, 3, 'fruit'); + selectAndCheck(fixture, 3, 0, ''); + })); + + it('label remains floating when switching between outlined and without outline', fakeAsync(() => { + const { fixture, testComponent } = setup(TestSwitchOutlinedComponent); + const root = fixture.nativeElement.querySelector('.mdc-select'); + checkFloating(fixture, false); + setAndCheck(fixture, 'vegetables', TestSwitchOutlinedComponent); + checkFloating(fixture, true); + validateDom(root, {outlined: true, selected: 2}); + testComponent.outlined = false; + fixture.detectChanges(); tick(20); + validateDom(root, {outlined: false, selected: 2}); + checkFloating(fixture, true); + testComponent.outlined = true; + fixture.detectChanges(); tick(20); + validateDom(root, {outlined: true, selected: 2}); + checkFloating(fixture, true); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, type = TestComponent) { + const testComponent = fixture.debugElement.injector.get(type); + const mdcSelect = fixture.debugElement.query(By.directive(MdcSelectDirective))?.injector.get(MdcSelectDirective); + testComponent.value = value; + fixture.detectChanges(); flush(); fixture.detectChanges(); flush(); fixture.detectChanges(); flush(); + if (value === 'invalid') + value = ''; + expect(mdcSelect.value).toBe(value || ''); + expect(testComponent.value).toBe(value || ''); + + checkFloating(fixture, value != null && value.length > 0); + } + + function selectAndCheck(fixture: ComponentFixture, focusIndex: number, selectIndex: number, value: string, type: Type = TestComponent) { + const testComponent = fixture.debugElement.injector.get(type); + const text = fixture.nativeElement.querySelector('.mdc-select__selected-text'); + const items = [...fixture.nativeElement.querySelectorAll('.mdc-list-item')]; + const mdcSelect = fixture.debugElement.query(By.directive(MdcSelectDirective))?.injector.get(MdcSelectDirective); + text.dispatchEvent(new Event('focus')); + simulateKey(text, 'ArrowDown'); + animationCycle(fixture); + expect(document.activeElement).toBe(items[focusIndex]); + let selected = focusIndex; + while (selected < selectIndex) { + simulateKey(items[selected], 'ArrowDown'); + fixture.detectChanges(); flush(); + expect(document.activeElement).toBe(items[++selected]); + } + while (selected > selectIndex) { + simulateKey(items[selected], 'ArrowUp'); + fixture.detectChanges(); flush(); + expect(document.activeElement).toBe(items[--selected]); + } + simulateKey(items[selected], 'Enter'); + animationCycle(fixture); + + expect(mdcSelect.value).toBe(value); + expect(testComponent.value).toBe(value); + + checkFloating(fixture, value != null && value.length > 0); + } + + @Component({ + template: ` +
+
+
{{value}}
+ Pick a Food Group +
+
+
    +
  • +
  • Bread, Cereal, Rice, and Pasta
  • +
  • Vegetables
  • +
  • Fruit
  • +
+
+
+
selected: {{value}}
+ ` + }) + class TestComponent { + value: any = null; + } + + @Component({ + template: ` +
+
+
{{value}}
+ Pick a Food Group +
+
+
    +
  • +
  • Bread, Cereal, Rice, and Pasta
  • +
  • Vegetables
  • +
  • Fruit
  • +
+
+
+
selected: {{value}}
+ ` + }) + class TestStaticComponent { + value: any = null; + labeled = true; + disabled = false; + } + + @Component({ + template: ` +
+
+
{{value}}
+ + + Floating Label + + +
+
+
    +
  • +
  • Bread, Cereal, Rice, and Pasta
  • +
  • Vegetables
  • +
  • Fruit
  • +
+
+
+
selected: {{value}}
+ ` + }) + class TestStaticOutlinedComponent { + value: any = null; + labeled = true; + disabled = false; + } + + @Component({ + template: ` +
+
+
{{value}}
+ + + Pick a Food Group + + + + Pick a Food Group + +
+
+
    +
  • +
  • Bread, Cereal, Rice, and Pasta
  • +
  • Vegetables
  • +
  • Fruit
  • +
+
+
+
selected: {{value}}
+ ` + }) + class TestSwitchOutlinedComponent { + value: any = null; + outlined = true; + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [ + ...SELECT_DIRECTIVES, + ...MENU_DIRECTIVES, + ...MENU_SURFACE_DIRECTIVES, + ...LIST_DIRECTIVES, + MdcFloatingLabelDirective, + ...NOTCHED_OUTLINE_DIRECTIVES, + compType] + }).createComponent(compType); + fixture.detectChanges(); flush(); + const testComponent = fixture.debugElement.injector.get(compType); + const select = fixture.nativeElement.querySelector('.mdc-select'); + return { fixture, testComponent, select }; + } +}); + +function validateDom(select, options: Partial<{ + outlined: boolean, + expanded: boolean, + disabled: boolean, + required: boolean, + labeled: boolean, + selected: number, + values: boolean + }> = {}) { + options = {...{ + outlined: false, + expanded: false, + disabled: false, + required: false, + labeled: true, + selected: -1, + values: true + }, ...options}; + + expect(select.classList).toContain('mdc-select'); + if (!options.labeled) + expect(select.classList).toContain('mdc-select--no-label'); + else + expect(select.classList).not.toContain('mdc-select--no-label'); + if (options.disabled) + expect(select.classList).toContain('mdc-select--disabled'); + else + expect(select.classList).not.toContain('mdc-select--disabled'); + if (options.required) + expect(select.classList).toContain('mdc-select--required'); + else + expect(select.classList).not.toContain('mdc-select--required'); + expect(select.children.length).toBe(2); + + const anchor = select.children[0]; + if (options.outlined) + expect(anchor.children.length).toBe(3); + else + expect(anchor.children.length).toBe(options.labeled ? 4 : 3); + const dropDownIcon = anchor.children[0]; + const selectedText = anchor.children[1]; + expect(selectedText.id).toMatch(/mdc-u-id-.*/); + const floatingLabel = anchor.querySelector('.mdc-floating-label'); + expect(!!floatingLabel).toBe(options.labeled); + if (floatingLabel) { + expect(floatingLabel.id).toMatch(/mdc-u-id-.*/); + expect(floatingLabel.classList).toContain('mdc-floating-label'); + } + if (options.outlined) { + const notchedOutline = anchor.children[2]; + expect(notchedOutline.classList).toContain('mdc-notched-outline'); + expect(notchedOutline.children.length).toBe(options.labeled ? 3 : 2); + expect(notchedOutline.children[0].classList).toContain('mdc-notched-outline__leading'); + expect(notchedOutline.children[notchedOutline.children.length - 1].classList).toContain('mdc-notched-outline__trailing'); + if (floatingLabel) { + expect(notchedOutline.children[1].classList).toContain('mdc-notched-outline__notch'); + const notch = notchedOutline.children[1]; + expect(notch.children.length).toBe(1); + expect(notch.children[0]).toBe(floatingLabel); + } + } else { + const lineRipple = anchor.children[anchor.children.length - 1]; + expect(lineRipple.classList).toContain('mdc-line-ripple'); + if (floatingLabel) + expect(anchor.children[2]).toBe(floatingLabel); + } + expect(dropDownIcon.classList).toContain('mdc-select__dropdown-icon'); + expect(selectedText.classList).toContain('mdc-select__selected-text'); + expect(selectedText.getAttribute('tabindex')).toBe(options.disabled ? '-1': '0'); + expect(selectedText.getAttribute('aria-disabled')).toBe(`${options.disabled}`); + expect(selectedText.getAttribute('aria-required')).toBe(`${options.required}`); + expect(selectedText.getAttribute('role')).toBe('button'); + expect(selectedText.getAttribute('aria-haspopup')).toBe('listbox'); + expect(selectedText.getAttribute('aria-labelledBy')).toBe(`${floatingLabel ? floatingLabel.id + ' ' : ''}${selectedText.id}`); + expect(selectedText.getAttribute('aria-expanded')).toBe(options.expanded ? 'true' : 'false'); + + expect(anchor.classList).toContain('mdc-select__anchor'); + + const menu = select.children[1]; + expect(menu.classList).toContain('mdc-select__menu'); + expect(menu.classList).toContain('mdc-menu'); + expect(menu.classList).toContain('mdc-menu-surface'); + expect(menu.children.length).toBe(1); + + const list = menu.children[0]; + expect(list.classList).toContain('mdc-list'); + expect(list.getAttribute('role')).toBe('listbox'); + expect(list.getAttribute('aria-labelledBy')).toBe(floatingLabel ? floatingLabel.id : null); + expect(list.getAttribute('tabindex')).toBeNull(); + const items = [...list.querySelectorAll('li')]; + let index = 0; + items.forEach(item => { + expect(item.classList).toContain('mdc-list-item'); + expect(item.getAttribute('role')).toBe('option'); + expect(item.getAttribute('tabindex')).toMatch(/0|-1/); + const selected = options.selected === index + expect(item.getAttribute('aria-selected')).toBe(selected ? 'true' : 'false'); + if (selected) + expect(item.classList).toContain('mdc-list-item--selected'); + else + expect(item.classList).not.toContain('mdc-list-item--selected'); + expect(item.hasAttribute('value')).toBe(options.values); + ++index; + }); + return { anchor, menu, list, items }; +} + +function validateFloatOnFocus(fixture) { + const floatingLabelElm = fixture.nativeElement.querySelector('.mdc-floating-label'); + const text = fixture.nativeElement.querySelector('.mdc-select__selected-text'); + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); + text.dispatchEvent(new Event('focus')); tick(); + expect(floatingLabelElm.classList).toContain('mdc-floating-label--float-above'); + text.dispatchEvent(new Event('blur')); tick(); + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); +} + +function checkFloating(fixture: ComponentFixture, expected: boolean) { + // when not empty, the label must be floating: + const floatingLabelElm = fixture.nativeElement.querySelector('.mdc-floating-label'); + if (floatingLabelElm) { + if (expected) + expect(floatingLabelElm.classList).toContain('mdc-floating-label--float-above'); + else + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); + } +} + +function animationCycle(fixture) { + fixture.detectChanges(); tick(300); flush(); +} diff --git a/bundle/src/components/select/mdc.select.directive.ts b/bundle/src/components/select/mdc.select.directive.ts index 81768a8..18289f2 100644 --- a/bundle/src/components/select/mdc.select.directive.ts +++ b/bundle/src/components/select/mdc.select.directive.ts @@ -1,284 +1,646 @@ -import { AfterContentInit, ContentChild, Directive, ElementRef, forwardRef, HostBinding, - Input, OnDestroy, OnInit, Optional, Renderer2, Self } from '@angular/core'; -import { NgControl } from '@angular/forms'; -import { MDCSelectFoundation } from '@material/select'; -import { MDCFloatingLabelFoundation } from '@material/floating-label'; -import { MDCLineRippleFoundation } from '@material/line-ripple'; -import { MdcSelectAdapter } from './mdc.select.adapter'; +import { AfterContentInit, Directive, ElementRef, forwardRef, HostBinding, + Input, OnDestroy, OnInit, Renderer2, Self, ContentChildren, QueryList, Host, SkipSelf, + HostListener, Inject, Output, EventEmitter } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { MDCLineRippleFoundation, MDCLineRippleAdapter } from '@material/line-ripple'; +import { MDCSelectFoundation, MDCSelectAdapter, cssClasses, strings } from '@material/select'; +import { Subject, merge } from 'rxjs'; +import { takeUntil, debounceTime } from 'rxjs/operators'; import { MdcFloatingLabelDirective } from '../floating-label/mdc.floating-label.directive'; -import { MdcLineRippleAdapter } from '../line-ripple/mdc.line-ripple.adapter'; -import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; -import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { NotchedOutlineSupport } from '../notched-outline/notched-outline.support'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; +import { MdcNotchedOutlineDirective } from '../notched-outline/mdc.notched-outline.directive'; +import { MdcMenuDirective } from '../menu/mdc.menu.directive'; +import { MdcMenuSurfaceDirective } from '../menu-surface/mdc.menu-surface.directive'; +import { MdcListFunction, MdcListDirective } from '../list/mdc.list.directive'; +import { HasId } from '../abstract/mixin.mdc.hasid'; +import { applyMixins } from '../../utils/mixins'; +import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; +import { asBoolean } from '../../utils/value.utils'; -const CLASS_SELECT = 'mdc-select'; -const CLASS_SELECT_CONTROL = 'mdc-select__native-control'; -const CLASS_LINE_RIPPLE = 'mdc-line-ripple'; - -let nextId = 1; +@Directive() +class MdcSelectTextDirectiveBase {} +interface MdcSelectTextDirectiveBase extends HasId {} +applyMixins(MdcSelectTextDirectiveBase, [HasId]); /** - * Directive for the select control of an mdcSelect directive. - * Should be used as the first child element of the mdcSelect. + * Directive for showing the text of the currently selected `mdcSelect` item. It is the responsibility + * of the host component to set the actual text (see examples). This makes the `mdcSelect` more flexible, + * so that e.g. the text of options can also contain markup to style parts of it differently. + * When no value is selected, the embedded text must be empty. + * + * # Accessibility + * * When no `id` is assigned, the component will generate a unique `id`, so that the `mdcSelectAnchor` + * and `mdcList` for this select can be labelled (with `aria-labelledBy`) appropriately. + * * The element will be made focusable and tabbable (with `tabindex=0`), unless disabled. + * * The `aria-disabled` will get a value based on the `disabled` property of the `mdcSelect`. + * * The `aria-required` will get a value based on the `required` property of the `mdcSelect`. + * * The `role` attribute will be set to `button`. + * * The `aria-haspopup` attribute will be set to `listbox`. + * * The `aria-labelledBy` attribute will list the ids of the `mdcFloatinglabel` and the `mdcSelectText` self. + * * The `aria-expanded` attribute will reflect whether this element is focused (the menu-surface is open). */ @Directive({ - selector: 'select[mdcSelectControl]', - providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcSelectControlDirective) }] + selector: '[mdcSelectText]' }) -export class MdcSelectControlDirective extends AbstractMdcInput implements OnInit, OnDestroy { - @HostBinding('class.' + CLASS_SELECT_CONTROL) _cls = true; - _onChange = (value) => {}; - private _id: string; - private _disabled = false; - private cachedId: string; +export class MdcSelectTextDirective extends MdcSelectTextDirectiveBase implements OnInit { + /** @internal */ + @HostBinding('class.mdc-select__selected-text') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role = 'button'; + /** @internal */ + @HostBinding('attr.aria-haspopup') _haspop = 'listbox'; + /** @internal */ + @HostBinding('attr.aria-labelledby') _labelledBy: string | null = null; - constructor(public _elm: ElementRef, private renderer: Renderer2, - public _registry: MdcEventRegistry, @Optional() @Self() public _cntr: NgControl) { + constructor(public _elm: ElementRef, @Host() @SkipSelf() @Inject(forwardRef(() => MdcSelectDirective)) private select: MdcSelectDirective) { super(); } ngOnInit() { - // Force setter to be called in case id was not specified. - this.id = this.id; - // Listen to changes, so that the label style can be updated when a value is - // set or cleared: - if (this._cntr) - this._cntr.valueChanges.subscribe(value => { - this._onChange(this._elm.nativeElement.selectedIndex); - }); + this.initId(); } - ngOnDestroy() { + /** @internal */ + @HostListener('focus') _onFocus() { + this.select.foundation?.handleFocus(); } - /** - * Mirrors the id attribute. If no id is assigned, this directive will - * assign a unique id by itself. If an mdcFloatingLabel for this select control - * is available, the mdcFloatingLabel will automatically set its for - * attribute to this id value. - */ - @HostBinding() - @Input() get id() { - return this._id; - } - - set id(value: string) { - this._id = value || this._newId(); + /** @internal */ + @HostListener('blur') _onBlur() { + this.select.onBlur(); } - /** - * If set to a value other than false, the mdcSelectControl will be in disabled state. - */ - @HostBinding() - @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; + /** @internal */ + @HostListener('keydown', ['$event']) _onKeydown(event: KeyboardEvent) { + this.select.foundation?.handleKeydown(event); } - set disabled(value: any) { - this._disabled = asBoolean(value); + /** @internal */ + @HostListener('click', ['$event']) _onClick(event: MouseEvent | TouchEvent) { + this.select.foundation?.handleClick(this.getNormalizedXCoordinate(event)); } - _newId(): string { - this.cachedId = this.cachedId || `mdc-select-${nextId++}`; - return this.cachedId; + private getNormalizedXCoordinate(event: MouseEvent | TouchEvent): number { + const targetClientRect = (event.target as Element).getBoundingClientRect(); + const xCoordinate = !!((event as TouchEvent).touches) ? (event as TouchEvent).touches[0].clientX : (event as MouseEvent).clientX; + return xCoordinate - targetClientRect.left; } } /** - * Directive for a spec aligned material design 'Select Control'. - * This directive should wrap an mdcSelectControl, and an - * mdcFloatingLabel directive. + * The `mdcSelectAnchor` should be the first child of an `mdcSelect`. It contains the dropdown-icon, + * `mdcSelectText`, `mdcFloatingLabel`, ripples, and may contain an optional `mdcNotchedOutline`. + * See the examples for the required structure of these directives. */ @Directive({ - selector: '[mdcSelect]' + selector: '[mdcSelectAnchor]' }) -export class MdcSelectDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.' + CLASS_SELECT) _cls = true; - @ContentChild(MdcSelectControlDirective) _control: MdcSelectControlDirective; - @ContentChild(MdcFloatingLabelDirective) _label: MdcFloatingLabelDirective; - private _outlineSupport: NotchedOutlineSupport; - private _initialized = false; - private _box = false; - private _outlined = false; - private _bottomLineElm: HTMLElement = null; - private _lineRippleAdapter: MdcLineRippleAdapter = { - addClass: (className: string) => this._rndr.addClass(this._bottomLineElm, className), - removeClass: (className: string) => this._rndr.removeClass(this._bottomLineElm, className), - hasClass: (className) => this._bottomLineElm.classList.contains(className), - setStyle: (name: string, value: string) => this._rndr.setStyle(this._bottomLineElm, name, value), - registerEventHandler: (evtType: string, handler: EventListener) => this._registry.listenElm(this._rndr, evtType, handler, this._bottomLineElm), - deregisterEventHandler: (evtType: string, handler: EventListener) => this._registry.unlisten(evtType, handler) - }; - private _lineRippleFoundation: { - init: Function, - destroy: Function, - activate: Function, - deactivate: Function, - setRippleCenter: (x: number) => void - } = new MDCLineRippleFoundation(this._lineRippleAdapter); - private adapter: MdcSelectAdapter = { - addClass: (className: string) => this._rndr.addClass(this._elm.nativeElement, className), - removeClass: (className: string) => this._rndr.removeClass(this._elm.nativeElement, className), - floatLabel: (value: boolean) => { - if (this._label) this._label._foundation.float(value); - }, - activateBottomLine: () => { - if (this._bottomLineElm) this._lineRippleFoundation.activate(); - }, - deactivateBottomLine: () => { - if (this._bottomLineElm) this._lineRippleFoundation.deactivate(); - }, - registerInteractionHandler: (type, handler) => this._control._registry.listen(this._rndr, type, handler, this._control._elm), - deregisterInteractionHandler: (type, handler) => this._control._registry.unlisten(type, handler), - getSelectedIndex: () => this._control._elm.nativeElement.selectedIndex, - setSelectedIndex: (index: number) => this._control._elm.nativeElement.selectedIndex = index, - setDisabled: (disabled: boolean) => this._control._elm.nativeElement.disabled = disabled, - getValue: () => this._control._elm.nativeElement.value, - setValue: (value: string) => this._control._elm.nativeElement.value = value, - isRtl: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', - hasLabel: () => !!this._label, - getLabelWidth: () => this._label._foundation.getWidth(), - hasOutline: () => this._outlined, - notchOutline: (labelWidth: number, isRtl: boolean) => this._outlineSupport.foundation.notch(labelWidth, isRtl), - closeOutline: () => this._outlineSupport.foundation.closeNotch() - }; - private foundation: { - init(), - destroy(), - setValue(value: string), - setDisabled(disabled: boolean), - setSelectedIndex(index: number), - notchOutline(openNotch: boolean) +export class MdcSelectAnchorDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { + private onDestroy$: Subject = new Subject(); + private onLabelsChange$: Subject = new Subject(); + /** @internal */ + @HostBinding('class.mdc-select__anchor') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcFloatingLabelDirective, {descendants: true}) _floatingLabels?: QueryList; + /** @internal */ + @ContentChildren(MdcNotchedOutlineDirective) _outlines?: QueryList; + /** @internal */ + @ContentChildren(MdcSelectTextDirective) _texts?: QueryList; + private _bottomLineElm: HTMLElement | null = null; + /** @internal */ + bottomLineFoundation: MDCLineRippleFoundation | null = null; + private mdcLineRippleAdapter: MDCLineRippleAdapter = { + addClass: (className) => this.rndr.addClass(this._bottomLineElm, className), + removeClass: (className) => this.rndr.removeClass(this._bottomLineElm, className), + hasClass: (className) => this._bottomLineElm!.classList.contains(className), + setStyle: (name, value) => this.rndr.setStyle(this._bottomLineElm, name, value), + registerEventHandler: (evtType, handler) => this._registry.listenElm(this.rndr, evtType, handler, this._bottomLineElm!), + deregisterEventHandler: (evtType, handler) => this._registry.unlisten(evtType, handler) }; - - constructor(private _elm: ElementRef, private _rndr: Renderer2, _registry: MdcEventRegistry) { - super(_elm, _rndr, _registry); - this._outlineSupport = new NotchedOutlineSupport(_elm, _rndr); + + constructor(public _elm: ElementRef, private rndr: Renderer2, registry: MdcEventRegistry, + @Host() @SkipSelf() @Inject(forwardRef(() => MdcSelectDirective)) private select: MdcSelectDirective, + @Inject(DOCUMENT) doc: any) { + super(_elm, rndr, registry, doc as Document); } ngAfterContentInit() { - if (!this._control || !this._label) - throw new Error('mdcSelect requires an embedded mdcSelectControl and mdcFloatingLabel'); - if (!this._label._initialized) - throw new Error('mdcFloatingLabel not properly initialized'); - this._initialized = true; + merge( + this._floatingLabels!.changes, + this._outlines!.changes + ).pipe( + takeUntil(this.onDestroy$), + debounceTime(1) + ).subscribe(() => { + this.reconstructComponent(); + }); + merge(this._floatingLabels!.changes, this._texts!.changes).pipe(takeUntil(this.onDestroy$)).subscribe(() => { + this.onLabelsChange$.next(); + this._label?.idChange().pipe(takeUntil(this.onLabelsChange$)).subscribe(() => { + this.computeLabelledBy(); + }); + this._text?.idChange().pipe(takeUntil(this.onLabelsChange$)).subscribe(() => { + this.computeLabelledBy(); + }); + this.computeLabelledBy(); + }); + this.addIcon(); this.initComponent(); - - if (this._control) - this._control._onChange = (value) => this.foundation.setSelectedIndex(value); + this.computeLabelledBy(); } - + ngOnDestroy() { + this.onLabelsChange$.next(); this.onLabelsChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + this.destroyRipple(); this.destroyLineRipple(); - this.foundation.destroy(); - this._control._onChange = (value) => {}; } private initComponent() { - this.initLineRipple(); - this.initBox(); - this.initOutline(); - this.foundation = new MDCSelectFoundation(this.adapter); - this.foundation.init(); + if (!this._outline) { + this.initLineRipple(); + this.initRipple(); + } } private destroyComponent() { + this.destroyRipple(); this.destroyLineRipple(); - this.destroyBox(); - this.destroyOutline(); - this.foundation.destroy(); } private reconstructComponent() { - if (this._initialized) { - this.destroyComponent(); - this.initComponent(); - this.recomputeOutline(); - } + this.destroyComponent(); + this.initComponent(); + } + + private addIcon() { + const icon = this.rndr.createElement('i'); + this.rndr.addClass(icon, 'mdc-select__dropdown-icon'); + if (this._elm.nativeElement.children.length > 0) + this.rndr.insertBefore(this._elm.nativeElement, icon, this._elm.nativeElement.children.item(0)); + else + this.rndr.appendChild(this._elm.nativeElement, icon); } private initLineRipple() { - if (!this._outlined) { - this._bottomLineElm = this._rndr.createElement('div'); - this._rndr.addClass(this._bottomLineElm, CLASS_LINE_RIPPLE); - this._rndr.appendChild(this._elm.nativeElement, this._bottomLineElm); - this._lineRippleFoundation.init(); + if (!this._bottomLineElm) { + this._bottomLineElm = this.rndr.createElement('div'); + this.rndr.addClass(this._bottomLineElm, 'mdc-line-ripple'); + this.rndr.appendChild(this._elm.nativeElement, this._bottomLineElm); + this.bottomLineFoundation = new MDCLineRippleFoundation(this.mdcLineRippleAdapter); + this.bottomLineFoundation.init(); } } private destroyLineRipple() { if (this._bottomLineElm) { - this._lineRippleFoundation.destroy(); - this._rndr.removeChild(this._elm.nativeElement, this._bottomLineElm); + this.bottomLineFoundation!.destroy(); + this.bottomLineFoundation = null; + this.rndr.removeChild(this._elm.nativeElement, this._bottomLineElm); this._bottomLineElm = null; } } - private initBox() { - if (this._box) - this.initRipple(); + private computeLabelledBy() { + let ids = []; + const labelId = this._label?.id; + if (labelId) + ids.push(labelId) + const textId = this._text?.id; + if (textId) + ids.push(textId); + if (this._text) + this._text._labelledBy = ids.join(' '); + this.select.setListLabelledBy(labelId || null); // the list should only use the id of the label } - private destroyBox() { - this.destroyRipple(); + /** @internal */ + get _outline() { + return this._outlines?.first; } - private initOutline() { - if (this._outlined) - this._outlineSupport.init(); + /** @internal */ + get _label() { + return this._floatingLabels?.first; } - private destroyOutline() { - this._outlineSupport.destroy(); + /** @internal */ + get _text() { + return this._texts?.first; } +} - private recomputeOutline() { - if (this._outlined) { - // the outline may not be valid after re-initialisation, recompute outline when all - // style/structural changes have been employed: - let inputValue = this._control._elm.nativeElement.value; - let shouldFloat = inputValue != null && inputValue.length > 0; - setTimeout(() => {this.foundation.notchOutline(shouldFloat); }, 0); - } - } +/** + * Directive for the options list of an `mdcSelect`. This directive should be the second (last) child + * of an `mdcSelect`, and should wrap an `mdcList` with all selection options. + * See the examples for the required structure of these directives. + * + * An `mdcSelectMenu` element will also match with the selector of the menu surface directive, documented + * here: mdcMenuSurface API. + */ +@Directive({ + selector: '[mdcSelectMenu]' +}) +export class MdcSelectMenuDirective { + /** @internal */ + @HostBinding('class.mdc-select__menu') readonly _cls = true; + + constructor(@Self() public _menu: MdcMenuDirective, @Self() public _surface: MdcMenuSurfaceDirective) {} +} +/** @docs-private */ +enum ValueSource { + control, foundation, program +}; + +/** + * Directive for a spec aligned material design 'Select Control'. This directive should contain + * and `mdcSelectAnchor` and an `mdcSelectMenu`. See the examples for the required structure of + * these directives. + * + * If leaving the select empty should be a valid option, include an `mdcListItem` as first element in the list, + * with an ampty string as `value`. + * + * # Accessibility + * * This directive implements the aria practices recommendations for a + * [listbox](https://www.w3.org/TR/wai-aria-practices/examples/listbox/listbox-collapsible.html). + * Most `aria-*` and `role` attributes affect the embedded `mdcSelectAnchor`, and `mdcList`, and are + * explained in the documentation for these directives. + */ +@Directive({ + selector: '[mdcSelect]' +}) +export class MdcSelectDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-select') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + private onMenuChange$: Subject = new Subject(); + private onItemsChange$: Subject = new Subject(); + private document: Document; + private _onChange: (value: any) => void = () => {}; + private _onTouched: () => any = () => {}; + private _lastMenu: MdcSelectMenuDirective | null = null; + private _value: string | null = null; + private _valueSource: ValueSource | null = null; + private _disabled = false; + private _required = false; + private _listLabelledBy: string | null = null; /** - * When this input is defined and does not have value false, the select will be styled as a - * box select. + * emits the value of the item when the selected item changes */ - @Input() @HostBinding('class.mdc-select--box') - get box() { - return this._box; + @Output() readonly valueChange: EventEmitter = new EventEmitter(); + /** @internal */ + @ContentChildren(MdcSelectAnchorDirective) _anchors?: QueryList; + /** @internal */ + @ContentChildren(MdcNotchedOutlineDirective, {descendants: true}) _outlines?: QueryList; + /** @internal */ + @ContentChildren(MdcSelectMenuDirective) _menus?: QueryList; + /** @internal */ + @ContentChildren(MdcListDirective, {descendants: true}) _lists?: QueryList; + /** @internal */ + @ContentChildren(MdcSelectTextDirective, {descendants: true}) _texts?: QueryList; + private mdcAdapter: MDCSelectAdapter = { + addClass: (className) => this.rndr.addClass(this.elm.nativeElement, className), + removeClass: (className) => this.rndr.removeClass(this.elm.nativeElement, className), + hasClass: (className) => this.elm.nativeElement.classList.contains(className), + activateBottomLine: () => this.anchor?.bottomLineFoundation?.activate(), + deactivateBottomLine: () => this.anchor?.bottomLineFoundation?.deactivate(), + getSelectedMenuItem: () => this.getSelectedItem()?._elm.nativeElement, + hasLabel: () => !!this.label, + floatLabel: (shouldFloat) => this.label?.float(shouldFloat), + getLabelWidth: () => this.label?.getWidth() || 0, + hasOutline: () => !!this.anchor?._outline, + notchOutline: (labelWidth) => this.anchor?._outline!.open(labelWidth), + closeOutline: () => this.anchor?._outline!.close(), + setRippleCenter: (normalizedX) => this.anchor?.bottomLineFoundation?.setRippleCenter(normalizedX), + notifyChange: (value) => this.updateValue(value, ValueSource.foundation), + // setSelectedText does nothing, library consumer should set the text; gives them more freedom to e.g. also use markup: + setSelectedText: () => undefined, + isSelectedTextFocused: () => !!(this.document.activeElement && this.document.activeElement === this.text?._elm.nativeElement), + getSelectedTextAttr: (attr) => this.text?._elm.nativeElement.getAttribute(attr), + setSelectedTextAttr: (attr, value) => this.text ? this.rndr.setAttribute(this.text._elm.nativeElement, attr, value) : undefined, + openMenu: () => this.menu!.openAndFocus(null), + closeMenu: () => this.menu!.doClose(), + getAnchorElement: () => this.anchor!._elm.nativeElement, + setMenuAnchorElement: (anchorEl) => this.surface!.menuAnchor = anchorEl, + setMenuAnchorCorner: (anchorCorner) => this.surface!.setFoundationAnchorCorner(anchorCorner), + setMenuWrapFocus: () => undefined, // foundation always sets this to false, which is the default anyway - skip + setAttributeAtIndex: (index, name, value) => { + if (name != strings.ARIA_SELECTED_ATTR) { + const item = this.menu?._list?.getItem(index)?._elm.nativeElement; + if (item) + this.rndr.setAttribute(item, name, value); + } + }, + removeAttributeAtIndex: (index, name) => { + if (name !== strings.ARIA_SELECTED_ATTR) { + const item = this.menu?._list?.getItem(index)?._elm.nativeElement; + if (item) + this.rndr.removeAttribute(item, name); + } + }, + focusMenuItemAtIndex: (index) => { + const item = this.menu?._list?.getItem(index)?._elm.nativeElement; + if (item) + item.focus(); + }, + getMenuItemCount: () => this.menu?._list?.getItems().length || 0, + getMenuItemValues: () => this.menu?._list?.getItems().map(item => item.value || '') || [], + // foundation uses this to 'setSelectedText', but that's ignored in our implementation (see remark on setSelectedText): + getMenuItemTextAtIndex: () => '', + getMenuItemAttr: (menuItem, attr) => { + if (attr === strings.VALUE_ATTR) + return this.menu?._list?.getItemByElement(menuItem)?.value || null; + return menuItem.getAttribute(attr); + }, + addClassAtIndex: (index, className) => { + const item = this.menu?._list?.getItem(index); + if (item && className === cssClasses.SELECTED_ITEM_CLASS) { + item.active = true; + } else if (item) + this.rndr.addClass(item._elm.nativeElement, className); + }, + removeClassAtIndex: (index, className) => { + const item = this.menu?._list?.getItem(index); + if (item && className === cssClasses.SELECTED_ITEM_CLASS) { + item.active = false; + } else if (item) + this.rndr.removeClass(this.menu!._list.getItem(index)!._elm.nativeElement, className); + } + }; + /** @internal */ + foundation: MDCSelectFoundation | null = null; + + constructor(private elm: ElementRef, private rndr: Renderer2, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; } - set box(val: any) { - let newVal = asBoolean(val); - if (newVal !== this._box) { - this._box = asBoolean(val); + ngAfterContentInit() { + this._lastMenu = this._menus!.first; + this._menus!.changes.subscribe(() => { + if (this._lastMenu !== this._menus!.first) { + this.onMenuChange$.next(); + this._lastMenu?._menu.itemValuesChanged.pipe(takeUntil(this.onMenuChange$)).subscribe(() => this.onItemsChange$.next()); + this._lastMenu = this._menus!.first; + this.setupMenuHandlers(); + } + }); + this._lists!.changes.subscribe(() => this.initListLabel()); + merge( + this.onMenuChange$, + // the foundation initializes with the values of the items, so if they change, the foundation must be reconstructed: + this.onItemsChange$, + // mdcSelectText change needs a complete re-init as well: + this._texts!.changes, + // when an outline is added/removed, a re-init is needed as well: + this._outlines!.changes + ).pipe( + takeUntil(this.onDestroy$), + debounceTime(1) + ).subscribe(() => { this.reconstructComponent(); + }); + this.initComponent(); + this.setupMenuHandlers(); + this.initListLabel(); + } + + ngOnDestroy() { + this.onMenuChange$.next(); this.onMenuChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + this.onItemsChange$.complete(); + this.destroyComponent(); + } + + private initComponent() { + this.foundation = new class extends MDCSelectFoundation { + isValid() { + //TODO: required effect on validity in combination with @angular/forms + //TODO: setValid/aria-invalid/helpertext validity + return super.isValid(); + } + }(this.mdcAdapter, { + helperText: undefined, + leadingIcon: undefined + }); + this.foundation.init(); + // foundation needs a call to setDisabled (even when false), because otherwise + // tabindex will not be set correctly: + this.foundation.setDisabled(this._disabled); + this.foundation.setRequired(this._required); + // foundation only updates aria-expanded on open/close, not on initialization: + this.mdcAdapter.setSelectedTextAttr('aria-expanded', `${this.surface!.open}`); + // TODO: it looks like the foundation doesn't update aria-expanded when the surface is + // opened programmatically. + } + + private destroyComponent() { + this.foundation?.destroy(); + this.foundation = null; + } + + private reconstructComponent() { + this.destroyComponent(); + this.initComponent(); + } + + private setupMenuHandlers() { + if (this.menu) { + this.menu._listFunction = MdcListFunction.select; + this.menu.pick.pipe(takeUntil(this.onMenuChange$)).subscribe((evt) => { + this.foundation?.handleMenuItemAction(evt.index); + }); + this.surface!.afterOpened.pipe(takeUntil(this.onMenuChange$)).subscribe(() => { + this.foundation?.handleMenuOpened(); + }); + this.surface!.afterClosed.pipe(takeUntil(this.onMenuChange$)).subscribe(() => { + this.foundation?.handleMenuClosed(); + }); } } + private initListLabel() { + this._lists!.forEach(list => { + list.labelledBy = this._listLabelledBy; + }); + } + /** - * When this input is set to a value other than false, the select control will be styled - * with a notched outline. + * The value of the selected item. */ - @HostBinding('class.mdc-select--outlined') @Input() - get outlined() { - return this._outlined; + @Input() get value() { + return this._value; } - set outlined(val: any) { - let newVal = asBoolean(val); - if (newVal !== this._outlined) { - this._outlined = asBoolean(val); - this.reconstructComponent(); + set value(value: string | null) { + this.updateValue(value, ValueSource.program); + } + + /** @internal */ + updateValue(value: string | null, source: ValueSource) { + const oldSource = this._valueSource; + try { + if (!this._valueSource) + this._valueSource = source; + if (source === ValueSource.foundation) { + this._value = value; + Promise.resolve().then(() => { + this.valueChange.emit(value); + if (this._valueSource !== ValueSource.control) + this._onChange(value); + }); + } else if (value !== this.value) { + if (this.foundation) { + this.foundation.setValue(value!); // foundation should also accept null value + // foundation will do a nested call for this function with source===foundation + // there we will handle the value change and emit to observers (see the if block preceding this) + } else { + this._value = value; + Promise.resolve().then(() => { + this.valueChange.emit(value); + if (this._valueSource !== ValueSource.control) + this._onChange(value); + }); + } + } + } finally { + this._valueSource = oldSource; } } - @HostBinding('class.mdc-select--disabled') get _disabled() { - return !this._control || this._control.disabled; + /** + * To disable the select, set this input to a value other then false. + */ + @Input() + get disabled() { + return this._disabled; + } + + set disabled(value: boolean) { + this._disabled = asBoolean(value); + this.foundation?.setDisabled(this._disabled); + } + + static ngAcceptInputType_disabled: boolean | ''; + + /** + * To make the select a required input, set this input to a value other then false. + */ + @Input() + get required() { + return this._required; + } + + set required(value: boolean) { + this._required = asBoolean(value); + this.foundation?.setRequired(this._required); + } + + static ngAcceptInputType_required: boolean | ''; + + /** @internal */ + @HostBinding('class.mdc-select--outlined') get outlined() { + return !!this.anchor?._outline; + } + + /** @internal */ + @HostBinding('class.mdc-select--no-label') get labeled() { + return !this.anchor?._label; + } + + /** @internal */ + setListLabelledBy(id: string | null) { + this._listLabelledBy = id; + this.initListLabel(); + } + + /** @internal */ + get expanded() { + return !!this.surface?.open; + } + + private get menu() { + return this._menus?.first?._menu; + } + + private get surface() { + return this._menus?.first?._surface; + } + + private get anchor() { + return this._anchors?.first; + } + + private get label() { + return this.anchor?._label; + } + + private get text() { + return this._texts?.first; + } + + private getSelectedItem() { + return this.menu?._list?.getSelectedItem(); + } + + /** @internal */ + registerOnChange(onChange: (value: any) => void) { + this._onChange = onChange; + } + + /** @internal */ + registerOnTouched(onTouched: () => any) { + this._onTouched = onTouched; + } + + /** @internal */ + onBlur() { + this.foundation?.handleBlur(); + this._onTouched(); } } + +/** + * Directive for adding Angular Forms (ControlValueAccessor) behavior to an + * `mdcSelect`. Allows the use of the Angular Forms API with select inputs, + * e.g. binding to [(ngModel)], form validation, etc. + */ +@Directive({ + selector: '[mdcSelect][formControlName],[mdcSelect][formControl],[mdcSelect][ngModel]', + providers: [ + {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsSelectDirective), multi: true} + ] +}) +export class MdcFormsSelectDirective implements ControlValueAccessor { + constructor(@Self() private mdcSelect: MdcSelectDirective) { + } + + /** @docs-private */ + writeValue(obj: any) { + this.mdcSelect.updateValue(obj, ValueSource.control); + } + + /** @docs-private */ + registerOnChange(onChange: (value: any) => void) { + this.mdcSelect.registerOnChange(onChange); + } + + /** @docs-private */ + registerOnTouched(onTouched: () => any) { + this.mdcSelect.registerOnTouched(onTouched); + } + + /** @docs-private */ + setDisabledState(disabled: boolean) { + this.mdcSelect.disabled = disabled; + } +} + +export const SELECT_DIRECTIVES = [ + MdcSelectTextDirective, + MdcSelectAnchorDirective, + MdcSelectMenuDirective, + MdcSelectDirective, + MdcFormsSelectDirective +]; diff --git a/bundle/src/components/slider/mdc.slider.adapter.ts b/bundle/src/components/slider/mdc.slider.adapter.ts deleted file mode 100644 index 7c1db31..0000000 --- a/bundle/src/components/slider/mdc.slider.adapter.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** @docs-private */ -export interface MdcSliderAdapter { - hasClass: (className: string ) => boolean, - addClass: (className: string) => void, - removeClass: (className: string) => void, - getAttribute: (name: string) => string | null, - setAttribute: (name: string, value: string) => void, - removeAttribute: (name: string) => void, - computeBoundingRect: () => ClientRect, - getTabIndex: () => number, - registerInteractionHandler: (type: string, handler: EventListener) => void, - deregisterInteractionHandler: (type: string, handler: EventListener) => void, - registerThumbContainerInteractionHandler: (type: string, handler: EventListener) => void, - deregisterThumbContainerInteractionHandler: (type: string, handler: EventListener) => void, - registerBodyInteractionHandler: (type: string, handler: EventListener) => void, - deregisterBodyInteractionHandler: (type: string, handler: EventListener) => void, - registerResizeHandler: (handler: EventListener) => void, - deregisterResizeHandler: (handler: EventListener) => void, - notifyInput: () => void, - notifyChange: () => void, - setThumbContainerStyleProperty: (propertyName: string, value: string) => void, - setTrackStyleProperty: (propertyName: string, value: string) => void, - setMarkerValue: (value: number) => void, - appendTrackMarkers: (numMarkers: number) => void, - removeTrackMarkers: () => void, - setLastTrackMarkersStyleProperty: (propertyName: string, value: string) => void, - isRTL: () => boolean -} \ No newline at end of file diff --git a/bundle/src/components/slider/mdc.slider.directive.spec.ts b/bundle/src/components/slider/mdc.slider.directive.spec.ts index a8f6aea..32d9c68 100644 --- a/bundle/src/components/slider/mdc.slider.directive.spec.ts +++ b/bundle/src/components/slider/mdc.slider.directive.spec.ts @@ -1,4 +1,4 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed, ComponentFixture, fakeAsync, tick, flush } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Component } from '@angular/core'; import { FormsModule } from '@angular/forms'; @@ -107,9 +107,11 @@ describe('MdcSliderDirective', () => { const slider: HTMLElement = fixture.nativeElement.querySelector('.mdc-slider'); expect(slider).toBeDefined(); expect(slider.getAttribute('tabindex')).toBe('0'); - expect(slider.getAttribute('aria-valuenow')).toBeNull(); - expect(slider.getAttribute('aria-valuemin')).toBeNull(); - expect(slider.getAttribute('aria-valuemax')).toBeNull(); + //value/min/max will always be assigned: + expect(slider.getAttribute('aria-valuenow')).toBe('0'); + expect(slider.getAttribute('aria-valuemin')).toBe('0'); + expect(slider.getAttribute('aria-valuemax')).toBe('0'); + expect(slider.getAttribute('aria-disabled')).toBe('false'); expect(slider.getAttribute('role')).toBe('slider'); })); @@ -120,7 +122,7 @@ describe('MdcSliderDirective', () => { const slider: HTMLElement = fixture.nativeElement.querySelector('.mdc-slider'); expect(slider).toBeDefined(); expect(slider.getAttribute('tabindex')).toBe('0'); - expect(slider.getAttribute('aria-valuenow')).toBeNull(); + expect(slider.getAttribute('aria-valuenow')).toBe('0'); // a value is always assigned, null is coerced to 0 (or min when min > 0) expect(slider.getAttribute('aria-valuemin')).toBe('0'); expect(slider.getAttribute('aria-valuemax')).toBe('100'); expect(slider.getAttribute('aria-disabled')).toBe('false'); @@ -141,7 +143,7 @@ describe('MdcSliderDirective', () => { testComponent.clear(); testComponent._value = 90; - fixture.detectChanges(); tick(); + fixture.detectChanges(); tick(); fixture.detectChanges(); expect(slider.getAttribute('aria-valuenow')).toBe('90'); expect(slider.getAttribute('aria-valuemin')).toBe('0'); @@ -150,7 +152,7 @@ describe('MdcSliderDirective', () => { testComponent.clear(); testComponent._max = 50; - fixture.detectChanges(); tick(); + fixture.detectChanges(); tick(); fixture.detectChanges(); expect(slider.getAttribute('aria-valuenow')).toBe('50'); expect(slider.getAttribute('aria-valuemin')).toBe('0'); @@ -161,7 +163,7 @@ describe('MdcSliderDirective', () => { testComponent.clear(); testComponent._value = 60; - fixture.detectChanges(); tick(); + fixture.detectChanges(); tick(); fixture.detectChanges(); expect(slider.getAttribute('aria-valuenow')).toBe('50'); expect(slider.getAttribute('aria-valuemin')).toBe('0'); expect(slider.getAttribute('aria-valuemax')).toBe('50'); @@ -171,7 +173,7 @@ describe('MdcSliderDirective', () => { testComponent.clear(); testComponent._min = 60; - fixture.detectChanges(); tick(); + fixture.detectChanges(); tick(); fixture.detectChanges(); expect(slider.getAttribute('aria-valuenow')).toBe('60'); expect(slider.getAttribute('aria-valuemin')).toBe('60'); expect(slider.getAttribute('aria-valuemax')).toBe('60'); @@ -182,7 +184,7 @@ describe('MdcSliderDirective', () => { testComponent.clear(); testComponent._max = 10; - fixture.detectChanges(); tick(); + fixture.detectChanges(); tick(); fixture.detectChanges(); expect(slider.getAttribute('aria-valuenow')).toBe('10'); expect(slider.getAttribute('aria-valuemin')).toBe('10'); expect(slider.getAttribute('aria-valuemax')).toBe('10'); @@ -200,6 +202,24 @@ describe('MdcSliderDirective', () => { testValueAndRangeChanges(FormsTestComponent, true); })); + it('can be discrete and have markers', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const testComponent = fixture.debugElement.injector.get(TestComponent); + + const slider: HTMLElement = fixture.nativeElement.querySelector('.mdc-slider'); + // dosn't have pin markers: + expect(slider.querySelector('div.mdc-slider__pin')).toBeNull(); + expect(slider.querySelector('div.mdc-slider__pin-value-marker')).toBeNull(); + + testComponent.discrete = true; + testComponent.markers = true; + fixture.detectChanges(); tick(25); + + // now must have pin markers: + expect(slider.querySelector('div.mdc-slider__pin')).not.toBeNull(); + expect(slider.querySelector('div.mdc-slider__pin-value-marker')).not.toBeNull(); + })); + function testDisabling(testComponentType: any, withForms: boolean) { const { fixture } = setup(testComponentType, withForms); const testComponent = fixture.debugElement.injector.get(testComponentType); diff --git a/bundle/src/components/slider/mdc.slider.directive.ts b/bundle/src/components/slider/mdc.slider.directive.ts index 58a3e83..5f6aa36 100644 --- a/bundle/src/components/slider/mdc.slider.directive.ts +++ b/bundle/src/components/slider/mdc.slider.directive.ts @@ -1,481 +1,478 @@ -import { AfterContentInit, AfterViewInit, Directive, ElementRef, EventEmitter, forwardRef, - HostBinding, Input, OnChanges, OnDestroy, Output, Renderer2, Self, SimpleChange, SimpleChanges } from '@angular/core'; -import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; -import { MDCSliderFoundation, strings } from '@material/slider'; -import { MdcSliderAdapter } from './mdc.slider.adapter'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -interface MdcSliderFoundationInterface { - init: () => void, - destroy: () => void, - setupTrackMarker(), - layout(), - getValue(), - setValue(value: number), - getMax(): number, - setMax(max: number), - getMin(): number, - setMin(min: number), - getStep(): number, - setStep(step: number), - isDisabled(): boolean, - setDisabled(disabled: boolean), -} - -/** - * Directive for creating a Material Design slider input. - * (Modelled after the <input type="range"/> element). - * The slider is fully accessible. The current implementation - * will add and manage all DOM child elements that are required for the wrapped - * mdc-slider component. - * Future implementations will also support supplying (customized) - * DOM children. - */ -@Directive({ - selector: '[mdcSlider]' -}) -export class MdcSliderDirective implements AfterContentInit, AfterViewInit, OnChanges, OnDestroy { - @HostBinding('class.mdc-slider') _cls = true; - @HostBinding('attr.role') _role: string = 'slider'; - /** - * Event emitted when the value changes. The value may change because of user input, - * or as a side affect of setting new min, max, or step values. - */ - @Output() valueChange: EventEmitter = new EventEmitter(); - /** - * Event emitted when the min range value changes. This may happen as a side effect - * of setting a new max value (when the new max is smaller than the old min). - */ - @Output() minValueChange: EventEmitter = new EventEmitter(); - /** - * Event emitted when the max range value changes. This may happen as a side effect - * of setting a new min value (when the new min is larger than the old max). - */ - @Output() maxValueChange: EventEmitter = new EventEmitter(); - /** - * Event emitted when the step value changes. This may happen as a side effect - * of making the slider discrete. - */ - @Output() stepValueChange: EventEmitter = new EventEmitter(); - private _initialized = false; - private _elmThumbCntr: HTMLElement; - private _elmSliderPin: HTMLElement; - private _elmValueMarker: HTMLElement; - private _elmTrack: HTMLElement; - private _elmTrackMarkerCntr: HTMLElement; - private _reinitTabIndex: number; - private _onChange: (value: any) => void = (value) => {}; - private _onTouched: () => any = () => {}; - private _discrete = false; - private _markers = false; - private _disabled = false; - private _value = 0; - private _min = 0; - private _max = 100; - private _step = 0; - private _lastWidth: number; - - private mdcAdapter: MdcSliderAdapter = { - hasClass: (className: string) => { - if (className === 'mdc-slider--discrete') - return this._discrete; - if (className === 'mdc-slider--display-markers') - return this._markers; - return this._root.nativeElement.classList.contains(className); - }, - addClass: (className: string) => { - this._rndr.addClass(this._root.nativeElement, className); - }, - removeClass: (className: string) => { - this._rndr.removeClass(this._root.nativeElement, className); - }, - getAttribute: (name: string) => this._root.nativeElement.getAttribute(name), - setAttribute: (name: string, value: string) => {this._rndr.setAttribute(this._root.nativeElement, name, value); }, - removeAttribute: (name: string) => {this._rndr.removeAttribute(this._root.nativeElement, name); }, - computeBoundingRect: () => this._root.nativeElement.getBoundingClientRect(), - getTabIndex: () => this._root.nativeElement.tabIndex, - registerInteractionHandler: (type: string, handler: EventListener) => { - this._registry.listen(this._rndr, type, handler, this._root); - }, - deregisterInteractionHandler: (type: string, handler: EventListener) => { - this._registry.unlisten(type, handler); - }, - registerThumbContainerInteractionHandler: (type: string, handler: EventListener) => { - this._registry.listenElm(this._rndr, type, handler, this._elmThumbCntr); - }, - deregisterThumbContainerInteractionHandler: (type: string, handler: EventListener) => { - this._registry.unlisten(type, handler); - }, - registerBodyInteractionHandler: (type: string, handler: EventListener) => { - this._registry.listenElm(this._rndr, type, handler, document.body); - }, - deregisterBodyInteractionHandler: (type: string, handler: EventListener) => { - this._registry.unlisten(type, handler); - }, - registerResizeHandler: (handler: EventListener) => { - this._registry.listenElm(this._rndr, 'resize', handler, window); - }, - deregisterResizeHandler: (handler: EventListener) => { - this._registry.unlisten('resize', handler); - }, - notifyInput: () => { - let newValue = this.asNumber(this.foundation.getValue()); - if (newValue !== this._value) { - this._value = newValue; - this.notifyValueChanged(); - } - }, - notifyChange: () => { - // currently not handling this event, if there is a usecase for this, please - // create a feature request. - }, - setThumbContainerStyleProperty: (propertyName: string, value: string) => { - this._rndr.setStyle(this._elmThumbCntr, propertyName, value); - }, - setTrackStyleProperty: (propertyName: string, value: string) => { - this._rndr.setStyle(this._elmTrack, propertyName, value); - }, - setMarkerValue: (value: number) => { - if (this._elmValueMarker) - this._elmValueMarker.innerText = value != null ? value.toString() : null; - }, - appendTrackMarkers: (numMarkers: number) => { - if (this._elmTrackMarkerCntr) { - const frag = document.createDocumentFragment(); - for (let i = 0; i < numMarkers; i++) { - const marker = document.createElement('div'); - marker.classList.add('mdc-slider__track-marker'); - frag.appendChild(marker); - } - this._rndr.appendChild(this._elmTrackMarkerCntr, frag); - } - }, - removeTrackMarkers: () => { - if (this._elmTrackMarkerCntr) - while (this._elmTrackMarkerCntr.firstChild) - this._rndr.removeChild(this._elmTrackMarkerCntr, this._elmTrackMarkerCntr.firstChild); - }, - setLastTrackMarkersStyleProperty: (propertyName: string, value: string) => { - const lastTrackMarker = this._root.nativeElement.querySelector('.mdc-slider__track-marker:last-child'); - if (lastTrackMarker) - this._rndr.setStyle(lastTrackMarker, propertyName, value); - }, - isRTL: () => getComputedStyle(this._root.nativeElement).direction === 'rtl' - }; - private foundation: MdcSliderFoundationInterface = new MDCSliderFoundation(this.mdcAdapter); - - constructor(private _rndr: Renderer2, private _root: ElementRef, private _registry: MdcEventRegistry) { - } - - ngAfterContentInit() { - this.initElements(); - this.initDefaultAttributes(); - this.foundation.init(); - this._lastWidth = this.mdcAdapter.computeBoundingRect().width; - this.updateValues({}); - this._initialized = true; - } - - ngAfterViewInit() { - this.updateLayout(); - } - - ngOnDestroy() { - this.foundation.destroy(); - } - - ngOnChanges(changes: SimpleChanges) { - this._onChanges(changes); - } - - _onChanges(changes: SimpleChanges) { - if (this._initialized) { - if (this.isChanged('discrete', changes) || this.isChanged('markers', changes)) { - this.foundation.destroy(); - this.initElements(); - this.initDefaultAttributes(); - this.foundation = new MDCSliderFoundation(this.mdcAdapter); - this.foundation.init(); - } - this.updateValues(changes); - this.updateLayout(); - } - } - - private isChanged(name: string, changes: SimpleChanges) { - return changes[name] && changes[name].currentValue !== changes[name].previousValue; - } - - private initElements() { - // initElements is also called when changes dictate a new Foundation initialization, - // in which case we create new child elements: - while (this._root.nativeElement.firstChild) - this._rndr.removeChild(this._root.nativeElement, this._root.nativeElement.firstChild); - const elmTrackContainer = this.addElement(this._root.nativeElement, 'div', ['mdc-slider__track-container']); - this._elmTrack = this.addElement(elmTrackContainer, 'div', ['mdc-slider__track']); - if (this._discrete && this._markers) - this._elmTrackMarkerCntr = this.addElement(elmTrackContainer, 'div', ['mdc-slider__track-marker-container']); - else - this._elmTrackMarkerCntr = null; - this._elmThumbCntr = this.addElement(this._root.nativeElement, 'div', ['mdc-slider__thumb-container']); - if (this._discrete) { - this._elmSliderPin = this.addElement(this._elmThumbCntr, 'div', ['mdc-slider__pin']); - this._elmValueMarker = this.addElement(this._elmSliderPin, 'div', ['mdc-slider__pin-value-marker']); - } else { - this._elmSliderPin = null; - this._elmValueMarker = null; - } - const svg = this._rndr.createElement('svg', 'svg'); - this._rndr.addClass(svg, 'mdc-slider__thumb'); - this._rndr.setAttribute(svg, 'width', '21'); - this._rndr.setAttribute(svg, 'height', '21'); - this._rndr.appendChild(this._elmThumbCntr, svg); - const circle = this._rndr.createElement('circle', 'svg'); - this._rndr.setAttribute(circle, 'cx', '10.5'); - this._rndr.setAttribute(circle, 'cy', '10.5'); - this._rndr.setAttribute(circle, 'r', '7.875'); - this._rndr.appendChild(svg, circle); - this.addElement(this._elmThumbCntr, 'div', ['mdc-slider__focus-ring']); - } - - private addElement(parent: HTMLElement, element: string, classNames: string[]) { - let child = this._rndr.createElement(element); - classNames.forEach(name => { - this._rndr.addClass(child, name); - }); - this._rndr.appendChild(parent, child); - return child; - } - - private initDefaultAttributes() { - if (this._reinitTabIndex) - // value was set the first time we initialized the foundation, - // so it should also be set when we reinitialize evrything: - this._root.nativeElement.tabIndex = this._reinitTabIndex; - else if (!this._root.nativeElement.hasAttribute('tabindex')) { - // unless overridden by another tabIndex, we want sliders to - // participate in tabbing (the foundation will remove the tabIndex - // when the slider is disabled, reset to the initial value when enabled again): - this._root.nativeElement.tabIndex = 0; - this._reinitTabIndex = 0; - } else { - this._reinitTabIndex = this._root.nativeElement.tabIndex; - } - } - - private updateValues(changes: SimpleChanges) { - if (this._discrete && this._step < 1) { - // See https://github.com/material-components/material-components-web/issues/1426 - // mdc-slider doesn't allow a discrete step value < 1 currently: - this._step = 1; - setTimeout(() => {this.stepValueChange.emit(this._step); }, 0); - } else if (this._step < 0) { - this._step = 0; - setTimeout(() => {this.stepValueChange.emit(this._step); }, 0); - } - if (this._min > this._max) { - if (this.isChanged('maxValue', changes)) { - this._min = this._max; - setTimeout(() => {this.minValueChange.emit(this._min); }, 0); - } else { - this._max = this._min; - setTimeout(() => {this.maxValueChange.emit(this._max); }, 0); - } - } - let currValue = changes['value'] ? changes['value'].currentValue : this._value; - if (this._value < this._min) - this._value = this._min; - if (this._value > this._max) - this._value = this._max; - // find an order in which the changed values will be accepted by the foundation - // (since the foundation will throw errors for min > max and other conditions): - if (this._min < this.foundation.getMax()) { - this.foundation.setMin(this._min); - this.foundation.setMax(this._max); - } else { - this.foundation.setMax(this._max); - this.foundation.setMin(this._min); - } - this.foundation.setStep(this._step); - if (this.foundation.isDisabled() !== this._disabled) { - // without this check, MDCFoundation may remove the tabIndex incorrectly, - // preventing the slider from getting focus on keyboard commands: - this.foundation.setDisabled(this._disabled); - } - // if we pass null, the foundation will make this a number, since we want to support 'no value', - // we're passing 'undefined' instead: - this.foundation.setValue(this._value == null ? undefined : this._value); - // value may have changed during setValue(), due to step settings: - this._value = this.asNumber(this.foundation.getValue()); - // compare with '!=' as null and undefined are considered the same (for initialisation sake): - if (currValue != this._value && !(isNaN(currValue) && isNaN(this._value))) - setTimeout(() => {this.notifyValueChanged(); }, 0); - } - - private updateLayout() { - let newWidth = this.mdcAdapter.computeBoundingRect().width; - if (newWidth !== this._lastWidth) { - this._lastWidth = newWidth; - this.foundation.layout(); - } - } - - private notifyValueChanged() { - this.valueChange.emit(this._value); - this._onChange(this._value); - } - - /** @docs-private */ - registerOnChange(onChange: (value: any) => void) { - this._onChange = onChange; - } - - /** @docs-private */ - registerOnTouched(onTouched: () => any) { - this._onTouched = onTouched; - } - - /** - * Make the slider discrete. Note from the wrapped mdc-slider - * component: - *
If a slider contains a step value it does not mean that the slider is a "discrete" slider. - * "Discrete slider" is a UX treatment, while having a step value is behavioral.
- */ - @Input() @HostBinding('class.mdc-slider--discrete') - get discrete() { - return this._discrete; - } - - set discrete(value: any) { - this._discrete = asBoolean(value); - } - - /** - * Property to enable/disable the display of track markers. Display markers - * are only supported for discrete sliders. Thus they are only shown when the values - * of both markers and discrete equal true. - */ - @Input() @HostBinding('class.mdc-slider--display-markers') - get markers() { - return this._markers; - } - - set markers(value: any) { - this._markers = asBoolean(value); - } - - /** - * The current value of the slider. - */ - @Input() @HostBinding('attr.aria-valuenow') - get value() { - return this._value; - } - - set value(value: string | number) { - this._value = this.asNumber(value); - } - - /** - * The minumum allowed value of the slider. - */ - @Input() @HostBinding('attr.aria-valuemin') - get minValue() { - return this._min; - } - - set minValue(value: string | number) { - this._min = this.asNumber(value); - } - - /** - * The maximum allowed value of the slider. - */ - @Input() @HostBinding('attr.aria-valuemax') - get maxValue() { - return this._max; - } - - set maxValue(value: string | number) { - this._max = this.asNumber(value); - } - - /** - * Set the step value (or set to 0 for no step value). - * The step value can be a floating point value >= 0. - * The slider will quantize all values to match the step value, except for the minimum and - * maximum, which can always be set. - * Discrete sliders are required to have a step value other than 0. - * Note from the wrapped mdc-slider component: - *
If a slider contains a step value it does not mean that the slider is a "discrete" slider. - * "Discrete slider" is a UX treatment, while having a step value is behavioral.
- */ - @Input() - get stepValue() { - return this._step; - } - - set stepValue(value: string | number) { - this._step = this.asNumber(value); - } - - /** - * A property to disable the slider. - */ - @Input() @HostBinding('attr.aria-disabled') - get disabled() { - return this._disabled; - } - - set disabled(value: any) { - this._disabled = asBoolean(value); - } - - asNumber(value: number | string): number { - if (value == null) - return value; - let result = +value; - if (isNaN(result)) - return null; - return result; - } -} - -/** - * Directive for adding Angular Forms (ControlValueAccessor) behavior to an - * MdcSliderDirective. Allows the use of the Angular Forms API with - * icon toggles, e.g. binding to [(ngModel)], form validation, etc. - */ -@Directive({ - selector: '[mdcSlider][formControlName],[mdcSlider][formControl],[mdcSlider][ngModel]', - providers: [ - {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsSliderDirective), multi: true} - ] -}) -export class MdcFormsSliderDirective implements ControlValueAccessor { - constructor(@Self() private mdcSlider: MdcSliderDirective) { - } - - /** @docs-private */ - writeValue(obj: any) { - let change = new SimpleChange(this.mdcSlider.value, this.mdcSlider.asNumber(obj), false); - this.mdcSlider.value = obj; - this.mdcSlider._onChanges({value: change}); - } - - /** @docs-private */ - registerOnChange(onChange: (value: any) => void) { - this.mdcSlider.registerOnChange(onChange); - } - - /** @docs-private */ - registerOnTouched(onTouched: () => any) { - this.mdcSlider.registerOnTouched(onTouched); - } - - /** @docs-private */ - setDisabledState(disabled: boolean) { - this.mdcSlider.disabled = disabled; - } -} +import { AfterContentInit, AfterViewInit, Directive, ElementRef, EventEmitter, forwardRef, + HostBinding, HostListener, Inject, Input, OnChanges, OnDestroy, Output, Renderer2, Self, SimpleChange, + SimpleChanges } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms'; +import { MDCSliderFoundation, MDCSliderAdapter } from '@material/slider'; +import { events } from '@material/dom'; +import { asBoolean } from '../../utils/value.utils'; +import { MdcEventRegistry } from '../../utils/mdc.event.registry'; + +/** + * Directive for creating a Material Design slider input. + * (Modelled after the <input type="range"/> element). + * The slider is fully accessible. The current implementation + * will add and manage all DOM child elements that are required for the wrapped + * mdc-slider component. + * Future implementations will also support supplying (customized) + * DOM children. + */ +@Directive({ + selector: '[mdcSlider]' +}) +export class MdcSliderDirective implements AfterContentInit, AfterViewInit, OnChanges, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-slider') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role: string = 'slider'; + /** + * Event emitted when the value changes. The value may change because of user input, + * or as a side affect of setting new min, max, or step values. + */ + @Output() readonly valueChange: EventEmitter = new EventEmitter(); + /** + * Event emitted when the min range value changes. This may happen as a side effect + * of setting a new max value (when the new max is smaller than the old min). + */ + @Output() readonly minValueChange: EventEmitter = new EventEmitter(); + /** + * Event emitted when the max range value changes. This may happen as a side effect + * of setting a new min value (when the new min is larger than the old max). + */ + @Output() readonly maxValueChange: EventEmitter = new EventEmitter(); + /** + * Event emitted when the step value changes. This may happen as a side effect + * of making the slider discrete. + */ + @Output() readonly stepValueChange: EventEmitter = new EventEmitter(); + private trackCntr: HTMLElement | null = null; + private _elmThumbCntr: HTMLElement | null = null; + private _elmSliderPin: HTMLElement | null = null; + private _elmValueMarker: HTMLElement | null = null; + private _elmTrack: HTMLElement | null = null; + private _elmTrackMarkerCntr: HTMLElement | null = null; + private _reinitTabIndex: number | null = null; + private _onChange: (value: any) => void = (value) => {}; + private _onTouched: () => any = () => {}; + private _discrete = false; + private _markers = false; + private _disabled = false; + private _value: number = 0; + private _min = 0; + private _max = 100; + private _step = 0; + private _lastWidth: number | null = null; + + private mdcAdapter: MDCSliderAdapter = { + hasClass: (className: string) => { + if (className === 'mdc-slider--discrete') + return this._discrete; + if (className === 'mdc-slider--display-markers') + return this._markers; + return this._root.nativeElement.classList.contains(className); + }, + addClass: (className: string) => { + this._rndr.addClass(this._root.nativeElement, className); + }, + removeClass: (className: string) => { + this._rndr.removeClass(this._root.nativeElement, className); + }, + getAttribute: (name: string) => this._root.nativeElement.getAttribute(name), + setAttribute: (name: string, value: string) => { + // skip attributes that we control with angular + if (!/^aria-(value.*|disabled)$/.test(name)) + this._rndr.setAttribute(this._root.nativeElement, name, value); + }, + removeAttribute: (name: string) => {this._rndr.removeAttribute(this._root.nativeElement, name); }, + computeBoundingRect: () => this._root.nativeElement.getBoundingClientRect(), + getTabIndex: () => this._root.nativeElement.tabIndex, + registerInteractionHandler: (evtType, handler) => this._registry.listen(this._rndr, evtType, handler, this._root, events.applyPassive()), + deregisterInteractionHandler: (evtType, handler) => this._registry.unlisten(evtType, handler), + registerThumbContainerInteractionHandler: (evtType, handler) => this._registry.listenElm(this._rndr, evtType, handler, this._elmThumbCntr!, events.applyPassive()), + deregisterThumbContainerInteractionHandler: (evtType, handler) => this._registry.unlisten(evtType, handler), + registerBodyInteractionHandler: (evtType, handler) => this._registry.listenElm(this._rndr, evtType, handler, this.document.body), + deregisterBodyInteractionHandler: (evtType, handler) => this._registry.unlisten(evtType, handler), + registerResizeHandler: (handler) => this._registry.listenElm(this._rndr, 'resize', handler, this.document.defaultView!), + deregisterResizeHandler: (handler) => this._registry.unlisten('resize', handler), + notifyInput: () => { + let newValue = this.asNumber(this.foundation!.getValue()); + if (newValue !== this._value) { + this._value = newValue!; + this.notifyValueChanged(); + } + }, + notifyChange: () => { + // currently not handling this event, if there is a usecase for this, please + // create a feature request. + }, + setThumbContainerStyleProperty: (propertyName: string, value: string) => { + this._rndr.setStyle(this._elmThumbCntr, propertyName, value); + }, + setTrackStyleProperty: (propertyName: string, value: string) => { + this._rndr.setStyle(this._elmTrack, propertyName, value); + }, + setMarkerValue: (value: number) => { + if (this._elmValueMarker) + this._elmValueMarker.innerText = value != null ? value.toLocaleString() : ''; + }, + setTrackMarkers: (step, max, min) => { + if (this._elmTrackMarkerCntr) { + // from https://github.com/material-components/material-components-web/blob/v5.1.0/packages/mdc-slider/component.ts#L141 + const stepStr = step.toLocaleString(); + const maxStr = max.toLocaleString(); + const minStr = min.toLocaleString(); + const markerAmount = `((${maxStr} - ${minStr}) / ${stepStr})`; + const markerWidth = `2px`; + const markerBkgdImage = `linear-gradient(to right, currentColor ${markerWidth}, transparent 0)`; + const markerBkgdLayout = `0 center / calc((100% - ${markerWidth}) / ${markerAmount}) 100% repeat-x`; + const markerBkgdShorthand = `${markerBkgdImage} ${markerBkgdLayout}`; + this._rndr.setStyle(this._elmTrackMarkerCntr, 'background', markerBkgdShorthand); + } + }, + isRTL: () => getComputedStyle(this._root.nativeElement).direction === 'rtl' + + }; + private foundation: MDCSliderFoundation | null = null; + private document: Document; + + constructor(private _rndr: Renderer2, private _root: ElementRef, private _registry: MdcEventRegistry, + @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 + } + + ngAfterContentInit() { + this.initElements(); + this.initDefaultAttributes(); + this.foundation = new MDCSliderFoundation(this.mdcAdapter) + this.foundation.init(); + this._lastWidth = this.mdcAdapter.computeBoundingRect().width; + this.updateValues({}); + } + + ngAfterViewInit() { + this.updateLayout(); + } + + ngOnDestroy() { + this.foundation?.destroy(); + } + + ngOnChanges(changes: SimpleChanges) { + this._onChanges(changes); + } + + /** @internal */ + _onChanges(changes: SimpleChanges) { + if (this.foundation) { + if (this.isChanged('discrete', changes) || this.isChanged('markers', changes)) { + this.foundation.destroy(); + this.initElements(); + this.initDefaultAttributes(); + this.foundation = new MDCSliderFoundation(this.mdcAdapter); + this.foundation.init(); + } + this.updateValues(changes); + this.updateLayout(); + } + } + + private isChanged(name: string, changes: SimpleChanges) { + return changes[name] && changes[name].currentValue !== changes[name].previousValue; + } + + private initElements() { + // initElements is also called when changes dictate a new Foundation initialization, + // in which case we create new child elements: + if (this.trackCntr) { + this._rndr.removeChild(this._root.nativeElement, this.trackCntr); + this._rndr.removeChild(this._root.nativeElement, this._elmThumbCntr); + } + this.trackCntr = this.addElement(this._root.nativeElement, 'div', ['mdc-slider__track-container']); + this._elmTrack = this.addElement(this.trackCntr!, 'div', ['mdc-slider__track']); + if (this._discrete && this._markers) + this._elmTrackMarkerCntr = this.addElement(this.trackCntr!, 'div', ['mdc-slider__track-marker-container']); + else + this._elmTrackMarkerCntr = null; + this._elmThumbCntr = this.addElement(this._root.nativeElement, 'div', ['mdc-slider__thumb-container']); + if (this._discrete) { + this._elmSliderPin = this.addElement(this._elmThumbCntr!, 'div', ['mdc-slider__pin']); + this._elmValueMarker = this.addElement(this._elmSliderPin!, 'div', ['mdc-slider__pin-value-marker']); + } else { + this._elmSliderPin = null; + this._elmValueMarker = null; + } + const svg = this._rndr.createElement('svg', 'svg'); + this._rndr.addClass(svg, 'mdc-slider__thumb'); + this._rndr.setAttribute(svg, 'width', '21'); + this._rndr.setAttribute(svg, 'height', '21'); + this._rndr.appendChild(this._elmThumbCntr, svg); + const circle = this._rndr.createElement('circle', 'svg'); + this._rndr.setAttribute(circle, 'cx', '10.5'); + this._rndr.setAttribute(circle, 'cy', '10.5'); + this._rndr.setAttribute(circle, 'r', '7.875'); + this._rndr.appendChild(svg, circle); + this.addElement(this._elmThumbCntr!, 'div', ['mdc-slider__focus-ring']); + } + + private addElement(parent: HTMLElement, element: string, classNames: string[]) { + let child = this._rndr.createElement(element); + classNames.forEach(name => { + this._rndr.addClass(child, name); + }); + this._rndr.appendChild(parent, child); + return child; + } + + private initDefaultAttributes() { + if (this._reinitTabIndex) + // value was set the first time we initialized the foundation, + // so it should also be set when we reinitialize evrything: + this._root.nativeElement.tabIndex = this._reinitTabIndex; + else if (!this._root.nativeElement.hasAttribute('tabindex')) { + // unless overridden by another tabIndex, we want sliders to + // participate in tabbing (the foundation will remove the tabIndex + // when the slider is disabled, reset to the initial value when enabled again): + this._root.nativeElement.tabIndex = 0; + this._reinitTabIndex = 0; + } else { + this._reinitTabIndex = this._root.nativeElement.tabIndex; + } + } + + private updateValues(changes: SimpleChanges) { + if (this._discrete && this._step < 1) { + // See https://github.com/material-components/material-components-web/issues/1426 + // mdc-slider doesn't allow a discrete step value < 1 currently: + this._step = 1; + Promise.resolve().then(() => {this.stepValueChange.emit(this._step); }); + } else if (this._step < 0) { + this._step = 0; + Promise.resolve().then(() => {this.stepValueChange.emit(this._step); }); + } + if (this._min > this._max) { + if (this.isChanged('maxValue', changes)) { + this._min = this._max; + Promise.resolve().then(() => {this.minValueChange.emit(this._min); }); + } else { + this._max = this._min; + Promise.resolve().then(() => {this.maxValueChange.emit(this._max); }); + } + } + let currValue = this.asNumber(changes['value'] ? changes['value'].currentValue : this._value); + if (this._value < this._min) + this._value = this._min; + if (this._value > this._max) + this._value = this._max; + // find an order in which the changed values will be accepted by the foundation + // (since the foundation will throw errors for min > max and other conditions): + if (this._min < this.foundation!.getMax()) { + this.foundation!.setMin(this._min); + this.foundation!.setMax(this._max); + } else { + this.foundation!.setMax(this._max); + this.foundation!.setMin(this._min); + } + this.foundation!.setStep(this._step); + if (this.foundation!.isDisabled() !== this._disabled) { + // without this check, MDCFoundation may remove the tabIndex incorrectly, + // preventing the slider from getting focus on keyboard commands: + this.foundation!.setDisabled(this._disabled); + } + this.foundation!.setValue(this._value); + // value may have changed during setValue(), due to step settings: + this._value = this.asNumber(this.foundation!.getValue()); + // compare with '!=' as null and undefined are considered the same (for initialisation sake): + if (currValue !== this._value) + Promise.resolve().then(() => {this.notifyValueChanged(); }); + } + + private updateLayout() { + let newWidth = this.mdcAdapter.computeBoundingRect().width; + if (newWidth !== this._lastWidth) { + this._lastWidth = newWidth; + this.foundation!.layout(); + } + } + + private notifyValueChanged() { + this.valueChange.emit(this._value); + this._onChange(this._value); + } + + /** @internal */ + registerOnChange(onChange: (value: any) => void) { + this._onChange = onChange; + } + + /** @internal */ + registerOnTouched(onTouched: () => any) { + this._onTouched = onTouched; + } + + /** + * Make the slider discrete. Note from the wrapped mdc-slider + * component: + *
If a slider contains a step value it does not mean that the slider is a "discrete" slider. + * "Discrete slider" is a UX treatment, while having a step value is behavioral.
+ */ + @Input() @HostBinding('class.mdc-slider--discrete') + get discrete() { + return this._discrete; + } + + set discrete(value: boolean) { + this._discrete = asBoolean(value); + } + + static ngAcceptInputType_discrete: boolean | ''; + + /** + * Property to enable/disable the display of track markers. Display markers + * are only supported for discrete sliders. Thus they are only shown when the values + * of both markers and discrete equal true. + */ + @Input() @HostBinding('class.mdc-slider--display-markers') + get markers() { + return this._markers; + } + + set markers(value: boolean) { + this._markers = asBoolean(value); + } + + static ngAcceptInputType_markers: boolean | ''; + + /** + * The current value of the slider. + */ + @Input() @HostBinding('attr.aria-valuenow') + get value() { + return this._value; + } + + set value(value: number) { + this._value = this.asNumber(value); + } + + static ngAcceptInputType_value: string | number; + + /** + * The minumum allowed value of the slider. + */ + @Input() @HostBinding('attr.aria-valuemin') + get minValue() { + return this._min; + } + + set minValue(value: number) { + this._min = this.asNumber(value); + } + + static ngAcceptInputType_minValue: string | number; + + /** + * The maximum allowed value of the slider. + */ + @Input() @HostBinding('attr.aria-valuemax') + get maxValue() { + return this._max; + } + + set maxValue(value: number) { + this._max = this.asNumber(value); + } + + static ngAcceptInputType_maxValue: string | number; + + /** + * Set the step value (or set to 0 for no step value). + * The step value can be a floating point value >= 0. + * The slider will quantize all values to match the step value, except for the minimum and + * maximum, which can always be set. + * Discrete sliders are required to have a step value other than 0. + * Note from the wrapped mdc-slider component: + *
If a slider contains a step value it does not mean that the slider is a "discrete" slider. + * "Discrete slider" is a UX treatment, while having a step value is behavioral.
+ */ + @Input() + get stepValue() { + return this._step; + } + + set stepValue(value: number) { + this._step = this.asNumber(value); + } + + static ngAcceptInputType_stepValue: string | number; + + /** + * A property to disable the slider. + */ + @Input() @HostBinding('attr.aria-disabled') + get disabled() { + return this._disabled; + } + + set disabled(value: boolean) { + this._disabled = asBoolean(value); + } + + static ngAcceptInputType_disabled: boolean | ''; + + /** @internal */ + @HostListener('blur') _onBlur() { + this._onTouched(); + } + + /** @internal */ + asNumber(value: number | string | null): number { + if (value == null) + return 0; + let result = +value; + if (isNaN(result)) + return 0; + return result; + } +} + +/** + * Directive for adding Angular Forms (ControlValueAccessor) behavior to an + * MdcSliderDirective. Allows the use of the Angular Forms API with + * icon toggles, e.g. binding to [(ngModel)], form validation, etc. + */ +@Directive({ + selector: '[mdcSlider][formControlName],[mdcSlider][formControl],[mdcSlider][ngModel]', + providers: [ + {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsSliderDirective), multi: true} + ] +}) +export class MdcFormsSliderDirective implements ControlValueAccessor { + constructor(@Self() private mdcSlider: MdcSliderDirective) { + } + + /** @docs-private */ + writeValue(obj: any) { + let change = new SimpleChange(this.mdcSlider.value, this.mdcSlider.asNumber(obj), false); + this.mdcSlider.value = obj; + this.mdcSlider._onChanges({value: change}); + } + + /** @docs-private */ + registerOnChange(onChange: (value: any) => void) { + this.mdcSlider.registerOnChange(onChange); + } + + /** @docs-private */ + registerOnTouched(onTouched: () => any) { + this.mdcSlider.registerOnTouched(onTouched); + } + + /** @docs-private */ + setDisabledState(disabled: boolean) { + this.mdcSlider.disabled = disabled; + } +} + +export const SLIDER_DIRECTIVES = [ + MdcSliderDirective, MdcFormsSliderDirective +]; diff --git a/bundle/src/components/snackbar/mdc.snackbar.adapter.ts b/bundle/src/components/snackbar/mdc.snackbar.adapter.ts deleted file mode 100644 index 0c65a2a..0000000 --- a/bundle/src/components/snackbar/mdc.snackbar.adapter.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** @docs-private */ -export interface MdcSnackbarAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - setAriaHidden: () => void; - unsetAriaHidden: () => void; - setActionAriaHidden: () => void; - unsetActionAriaHidden: () => void; - setActionText: (actionText: string) => void; - setMessageText: (message: string) => void; - setFocus: () => void; - visibilityIsHidden: () => boolean; - registerCapturedBlurHandler: (handler: EventListener) => void; - deregisterCapturedBlurHandler: (handler: EventListener) => void; - registerVisibilityChangeHandler: (handler: EventListener) => void; - deregisterVisibilityChangeHandler: (handler: EventListener) => void; - registerCapturedInteractionHandler: (evtType: string, handler: EventListener) => void; - deregisterCapturedInteractionHandler: (evtType: string, handler: EventListener) => void; - registerActionClickHandler: (handler: EventListener) => void; - deregisterActionClickHandler: (handler: EventListener) => void; - registerTransitionEndHandler: (handler: EventListener) => void; - deregisterTransitionEndHandler: (handler: EventListener) => void; - notifyShow: () => void; - notifyHide: () => void; -} diff --git a/bundle/src/components/snackbar/mdc.snackbar.message.ts b/bundle/src/components/snackbar/mdc.snackbar.message.ts index 9c009be..dc38ca9 100644 --- a/bundle/src/components/snackbar/mdc.snackbar.message.ts +++ b/bundle/src/components/snackbar/mdc.snackbar.message.ts @@ -11,15 +11,13 @@ export interface MdcSnackbarMessage { */ actionText?: string, /** - * Whether to show the snackbar with space for multiple lines of text (optional, default is false). + * Action buttons with long texts should be positioned below the label instead of alongside it. + * Set the stacked option to true to accomplish this. */ - multiline?: boolean, + stacked?: boolean, /** - * Whether to show the action below the multiple lines of text (optional, only applies when multiline is true). + * The amount of time in milliseconds to show the snackbar (optional, default is 5000ms). + * Value must be between 4000 and 10000, or -1 to disable the timeout completely. */ - actionOnBottom?: boolean, - /** - * The amount of time in milliseconds to show the snackbar (optional, default is 2750ms). - */ - timeout?: number + timeout?: number, } diff --git a/bundle/src/components/snackbar/mdc.snackbar.service.spec.ts b/bundle/src/components/snackbar/mdc.snackbar.service.spec.ts new file mode 100644 index 0000000..63589aa --- /dev/null +++ b/bundle/src/components/snackbar/mdc.snackbar.service.spec.ts @@ -0,0 +1,153 @@ +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdcSnackbarService } from './mdc.snackbar.service'; +import { numbers } from '@material/snackbar/constants'; +import { simulateKey } from '../../testutils/page.test'; + +const template = `
Testing Snackbar
`; + +describe('MdcSnackbarService', () => { + let service: MdcSnackbarService = null; + @Component({ + template: template + }) + class TestComponent { + constructor(public snackbar: MdcSnackbarService) {} + } + + function setup(testComponentType: any = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [testComponentType] + }).createComponent(testComponentType); + fixture.detectChanges(); + service = fixture.debugElement.injector.get(MdcSnackbarService); + return { fixture, service }; + } + + afterEach(() => { + if (service) { + service.onDestroy(); + service = null; + } + }); + + it('not initialized before it is used', fakeAsync(() => { + const { service } = setup(TestComponent); + // reading the proprties does not initialize anything yet: + expect(service.leading).toBe(false); + expect(service.closeOnEscape).toBe(true); + expect(document.querySelector('.mdc-snackbar')).toBeNull(); + // setting the leading property forces initialization of elements and foundation: + service.leading = true; + expect(document.querySelector('.mdc-snackbar')).not.toBeNull(); + // check the new values of properties: + expect(service.leading).toBe(true); + expect(service.closeOnEscape).toBe(true); + })); + + it('should show and queue messages', fakeAsync(() => { + const { service } = setup(TestComponent); + expect(document.querySelector('.mdc-snackbar__label')).toBeNull(); + + // show first message: + const ref1 = service.show({ + message: 'Hello my old friend' + }); + tick(1); + // queue next message: + const ref2 = service.show({ + message: 'People talking without speaking' + }); + tick(numbers.SNACKBAR_ANIMATION_OPEN_TIME_MS); + tick(numbers.ARIA_LIVE_DELAY_MS); + expect(document.querySelector('.mdc-snackbar__label').textContent).toBe('Hello my old friend'); + tick(numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS - numbers.ARIA_LIVE_DELAY_MS); + tick(numbers.SNACKBAR_ANIMATION_CLOSE_TIME_MS); + expect(document.querySelector('.mdc-snackbar').classList).toContain('mdc-snackbar--closing'); + waitForNotClass('mdc-snackbar--closing'); + expect(document.querySelector('.mdc-snackbar').classList).toContain('mdc-snackbar--opening'); + tick(numbers.SNACKBAR_ANIMATION_OPEN_TIME_MS + numbers.ARIA_LIVE_DELAY_MS); + expect(document.querySelector('.mdc-snackbar__label').textContent).toBe('People talking without speaking'); + flush(); + })); + + it('should send afterOpened, and afterClosed events', fakeAsync(() => { + const { service } = setup(TestComponent); + expect(document.querySelector('.mdc-snackbar__label')).toBeNull(); + const ref = service.show({ + message: 'Hello my old friend' + }); + let events = []; + ref.afterOpened().subscribe(() => events.push('afterOpened')); + ref.afterClosed().subscribe(reason => events.push('afterClosed#' + reason)); + ref.action().subscribe(() => events.push('action')); + tick(1); + + expect(events).toEqual([]); + tick(numbers.SNACKBAR_ANIMATION_OPEN_TIME_MS); + waitForNotClass('mdc-snackbar--opening'); + expect(events).toEqual(['afterOpened']); + tick(numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS); + tick(numbers.SNACKBAR_ANIMATION_CLOSE_TIME_MS); + waitForNotClass('mdc-snackbar--closing'); + expect(events).toEqual(['afterOpened', 'afterClosed#dismiss']); + flush(); + })); + + it('action click should trigger event and close snackbar', fakeAsync(() => { + const { service } = setup(TestComponent); + expect(document.querySelector('.mdc-snackbar__label')).toBeNull(); + const ref = service.show({ + message: 'Hello my old friend' + }); + let events = []; + ref.afterOpened().subscribe(() => events.push('afterOpened')); + ref.afterClosed().subscribe(reason => events.push('afterClosed#' + reason)); + ref.action().subscribe(() => events.push('action')); + tick(1); + + expect(events).toEqual([]); + tick(numbers.SNACKBAR_ANIMATION_OPEN_TIME_MS); + waitForNotClass('mdc-snackbar--opening'); + (document.querySelector('.mdc-snackbar__action')).click(); + expect(events).toEqual(['afterOpened', 'action']); + tick(numbers.SNACKBAR_ANIMATION_CLOSE_TIME_MS); + waitForNotClass('mdc-snackbar--closing'); + expect(events).toEqual(['afterOpened', 'action', 'afterClosed#action']); + flush(); + })); + + it('escape button only closes when closeOnEscape is true (default)', fakeAsync(() => { + const { service } = setup(TestComponent); + expect(document.querySelector('.mdc-snackbar__label')).toBeNull(); + + service.show({message: 'Hello my old friend'}); + const snackbar = document.querySelector('.mdc-snackbar'); + pressEscapeAfterOpened(snackbar); + expect(snackbar.className).not.toMatch(/.*open.*/); // closed + flush(); + + // when closeOnEscape == false, the snackbar should not be closed: + service.closeOnEscape = false; + service.show({message: 'Hello my old friend'}); + pressEscapeAfterOpened(snackbar); + expect(snackbar.className).toMatch(/.*open.*/); // still open! + flush(); + + })); + + function pressEscapeAfterOpened(snackbar) { + tick(numbers.SNACKBAR_ANIMATION_OPEN_TIME_MS); + waitForNotClass('mdc-snackbar--opening'); + simulateKey(snackbar, 'Escape'); + tick(numbers.SNACKBAR_ANIMATION_CLOSE_TIME_MS); + waitForNotClass('mdc-snackbar--closing', 20); + } + + function waitForNotClass(clazz: string, ms = 20) { + // this should typically take less than 20ms, the rquestAnimationFrame time that we haven't + // ticked yet. + for (let i = 0; i != ms && document.querySelector('.mdc-snackbar').classList.contains(clazz); ++i) + tick(1); + } +}); diff --git a/bundle/src/components/snackbar/mdc.snackbar.service.ts b/bundle/src/components/snackbar/mdc.snackbar.service.ts index b0fc8d5..c4fc3b4 100644 --- a/bundle/src/components/snackbar/mdc.snackbar.service.ts +++ b/bundle/src/components/snackbar/mdc.snackbar.service.ts @@ -1,224 +1,241 @@ -import { Injectable, Optional, Renderer2, SkipSelf } from '@angular/core'; -import { getCorrectEventName } from '@material/animation'; -import { MDCSnackbar, MDCSnackbarFoundation } from '@material/snackbar'; -import { Observable, Subject } from 'rxjs'; -import { filter, take } from 'rxjs/operators'; -import { MdcSnackbarAdapter } from './mdc.snackbar.adapter'; -import { MdcSnackbarMessage } from './mdc.snackbar.message'; - -const CLASS_ACTIVE = 'mdc-snackbar--active'; -const CLASS_ALIGN_START = 'mdc-snackbar--align-start'; - -/** - * This class provides information about a posted snackbar message. - * It can also be used to subscribe to action clicks. - */ -export class MdcSnackbarRef { - constructor( - private _action: Subject, - private _show: Subject, - private _hide: Subject - ) {} - - /** - * Subscribe to this observable to be informed when a user clicks the action - * for the shown snackbar. Note that the observable will complete when the snackbar - * disappears from screen, so there is no need to unsubscribe. - */ - action(): Observable { - return this._action.asObservable(); - } - - /** - * Subscribe to this observable to be informed when the message is displayed. - * Note that the observable will complete when the snackbar disappears from screen, - * so there is no need to unsubscribe. - */ - afterShow(): Observable { - return this._show.asObservable(); - } - - /** - * Subscribe to this observable to be informed when the message disappears. - * Note that the observable will complete immediately afterwards, so there is - * no need to unsubscribe. - */ - afterHide(): Observable { - return this._hide.asObservable(); - } -} - -/** - * A service for showing spec-aligned material design snackbar/toast messages. - */ -@Injectable({ - providedIn: 'root' -}) -export class MdcSnackbarService { - private snackbar: MDCSnackbar = null; - private root: HTMLElement = null; - private isActive = false; - private postedMessages = 0; - private lastActivated = -1; - private lastDismissed = -1; - - private openMessage: Subject = new Subject(); - private closeMessage: Subject = new Subject(); - - constructor() { - } - - private initHtml() { - if (!this.snackbar) { - this.root = document.createElement('div'); - this.root.classList.add('mdc-snackbar'); - this.root.setAttribute('aria-live', 'assertive'); - this.root.setAttribute('aria-atomic', 'true'); - this.root.setAttribute('aria-hidden', 'true'); - let snackbarText = document.createElement('div'); - snackbarText.classList.add('mdc-snackbar__text'); - this.root.appendChild(snackbarText); - let snackbarAction = document.createElement('div'); - snackbarAction.classList.add('mdc-snackbar__action-wrapper'); - this.root.appendChild(snackbarAction); - let snackbarActionButton = document.createElement('button'); - snackbarActionButton.classList.add('mdc-snackbar__action-button'); - snackbarActionButton.setAttribute('type', 'button'); - snackbarAction.appendChild(snackbarActionButton); - document.body.appendChild(this.root); - this.snackbar = new MDCSnackbar(this.root, this.getFoundation(this.root)); - } - } - - private getFoundation(root: HTMLElement): MDCSnackbarFoundation { - const textEl = root.querySelector('.mdc-snackbar__text'); - const buttonEl = root.querySelector('.mdc-snackbar__action-button'); - const adapter: MdcSnackbarAdapter = { - addClass: (className) => { root.classList.add(className); }, - removeClass: (className) => { root.classList.remove(className); }, - setAriaHidden: () => root.setAttribute('aria-hidden', 'true'), - unsetAriaHidden: () => root.removeAttribute('aria-hidden'), - setActionAriaHidden: () => buttonEl.setAttribute('aria-hidden', 'true'), - unsetActionAriaHidden: () => buttonEl.removeAttribute('aria-hidden'), - setActionText: (text) => { buttonEl.textContent = text; }, - setMessageText: (text) => { textEl.textContent = text; }, - setFocus: () => buttonEl.focus(), - visibilityIsHidden: () => document.hidden, - registerCapturedBlurHandler: (handler) => buttonEl.addEventListener('blur', handler, true), - deregisterCapturedBlurHandler: (handler) => buttonEl.removeEventListener('blur', handler, true), - registerVisibilityChangeHandler: (handler) => document.addEventListener('visibilitychange', handler), - deregisterVisibilityChangeHandler: (handler) => document.removeEventListener('visibilitychange', handler), - registerCapturedInteractionHandler: (evt, handler) => document.body.addEventListener(evt, handler, true), - deregisterCapturedInteractionHandler: (evt, handler) => document.body.removeEventListener(evt, handler, true), - registerActionClickHandler: (handler) => buttonEl.addEventListener('click', handler), - deregisterActionClickHandler: (handler) => buttonEl.removeEventListener('click', handler), - registerTransitionEndHandler: (handler) => root.addEventListener(getCorrectEventName(window, 'transitionend'), handler), - deregisterTransitionEndHandler: (handler) => root.removeEventListener(getCorrectEventName(window, 'transitionend'), handler), - notifyShow: () => { this.activateNext(); }, - notifyHide: () => { this.deactivateLast(); } - } - return new MDCSnackbarFoundation(adapter); - } - - private activateNext() { - while (this.lastDismissed < this.lastActivated) - // since this activates a new message, all messages before will logically be closed: - this.closeMessage.next(++this.lastDismissed); - this.openMessage.next(++this.lastActivated); - this.isActive = true; - } - - private deactivateLast() { - if (this.isActive) { - ++this.lastDismissed; - this.isActive = false; - this.closeMessage.next(this.lastDismissed); - } - } - - /** - * Show a snackbar/toast message. If a snackbar message is already showing, the new - * message will be queued to show after earlier message have been shown. - * The returned MdcSnackbarRef provides methods to subscribe to action clicks. - * - * @param message Queue a snackbar message to show. - */ - show(message: MdcSnackbarMessage): MdcSnackbarRef { - // make sure data passes precondition checks in foundation, - // or our counters will not be right after snackbar.show throws exception: - if (!message) - throw new Error('snackbar message called with no data'); - if (!message.message) - throw new Error('snackbar message is missing the actual message text'); - - this.initHtml(); - let messageNr = this.postedMessages++; - let data: any = { - message: message.message, - actionText: message.actionText, - multiline: message.multiline, - actionOnBottom: message.actionOnBottom, - timeout: message.timeout - }; - - // provide a means to subscribe to an action click: - let action = new Subject(); - let show = new Subject(); - let hide = new Subject(); - if (message.actionText) - data.actionHandler = function() { action.next(); }; - - // manage the show subscription - this.openMessage.asObservable().pipe( - filter(nr => nr === messageNr), - take(1) - ).subscribe(nr => { show.next(); }); - // manage the hide subscription, and close complete all observables when the - // message is removed: - this.closeMessage.asObservable().pipe( - filter(nr => nr === messageNr), - take(1) - ).subscribe(nr => { - hide.next(); - show.complete(); - hide.complete(); - action.complete(); - }); - - // show the actual snackbar, using setTimeout to give callers - // a chance to subscribe to all events: - setTimeout(() => {this.snackbar.show(data); }); - - return new MdcSnackbarRef(action, show, hide); - } - - /** - * Set this property to true to show snackbars start-aligned instead of center-aligned. Desktop and tablet only. - */ - get startAligned(): boolean { - return this.snackbar ? this.root.classList.contains(CLASS_ALIGN_START) : false; - } - - set startAligned(value: boolean) { - this.initHtml(); - if (value) - this.root.classList.add(CLASS_ALIGN_START); - else - this.root.classList.remove(CLASS_ALIGN_START); - } - - /** - * By default the snackbar will be dimissed when the user presses the action button. - * If you want the snackbar to remain visible until the timeout is reached (regardless of - * whether the user pressed the action button or not) you can set the dismissesOnAction - * property to false. - */ - get dismissesOnAction(): boolean { - return this.snackbar ? this.snackbar.dismissesOnAction : true; - } - - set dismissesOnAction(value: boolean) { - this.initHtml(); - this.snackbar.dismissesOnAction = value; - } -} +import { DOCUMENT } from '@angular/common'; +import { Inject, Injectable } from '@angular/core'; +import { MDCSnackbarAdapter, MDCSnackbarFoundation, numbers } from '@material/snackbar'; +import { util } from '@material/snackbar'; +import { Observable, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { MdcSnackbarMessage } from './mdc.snackbar.message'; + +const CLASS_LEADING = 'mdc-snackbar--leading'; +const CLASS_STACKED = 'mdc-snackbar--stacked'; + + +/** + * This class provides information about a posted snackbar message. + * It can also be used to subscribe to action clicks. + */ +export abstract class MdcSnackbarRef { + /** + * Subscribe to this observable to be informed when a user clicks the action + * for the shown snackbar. Note that the observable will complete when the snackbar + * disappears from screen, so there is no need to unsubscribe. + */ + abstract action(): Observable; + + /** + * Subscribe to this observable to be informed when the message is displayed. + * Note that the observable will complete when the snackbar disappears from screen, + * so there is no need to unsubscribe. + */ + abstract afterOpened(): Observable; + + /** + * Subscribe to this observable to be informed when the message has disappeared. + * Note that the observable will complete immediately afterwards, so there is + * no need to unsubscribe. + * The observed value is the `reason` string that was provided for closing the snackbar. + */ + abstract afterClosed(): Observable; +} + +// internal representation of the snackbar +class MdcSnackbarInfo extends MdcSnackbarRef { + /** @internal */ + public _action: Subject = new Subject(); + /** @internal */ + public _opened: Subject = new Subject(); + /** @internal */ + public _closed: Subject = new Subject(); + + constructor(public message: MdcSnackbarMessage) { + super(); + } + + action(): Observable { + return this._action.asObservable(); + } + + afterOpened(): Observable { + return this._opened.asObservable(); + } + + afterClosed(): Observable { + return this._closed.asObservable(); + } +} + +/** + * A service for showing spec-aligned material design snackbar/toast messages. + */ +@Injectable({ + providedIn: 'root' +}) +export class MdcSnackbarService { + private onDestroy$: Subject = new Subject(); + private closed: Subject = new Subject(); + private root: HTMLElement | null = null; + private label: HTMLElement | null = null; + private actionButton: HTMLElement | null = null; + private actionLabel: HTMLElement | null = null; + private adapter: MDCSnackbarAdapter = { + addClass: (name) => this.root!.classList.add(name), + announce: () => util.announce(this.label!, this.label!), + notifyClosed: (reason) => this.closed.next(reason), + notifyClosing: () => {}, + notifyOpened: () => this.current?._opened.next(), + notifyOpening: () => {}, + removeClass: (name) => this.root!.classList.remove(name) + }; + private handleActionClick = (evt: MouseEvent) => { + try { + (this.queue.length > 0) && this.queue[0]._action.next(); + } finally { + this.foundation!.handleActionButtonClick(evt); + } + }; + private handleKeyDown = (evt: KeyboardEvent) => this.foundation!.handleKeyDown(evt); + private foundation: MDCSnackbarFoundation | null = null; + private queue: MdcSnackbarInfo[] = []; + private document: Document; + + constructor(@Inject(DOCUMENT) doc: any) { + this.document = doc as Document; + } + + private init() { + if (!this.foundation) { + this.root = this.document.createElement('div'); + this.root.classList.add('mdc-snackbar'); + let surface = this.document.createElement('div'); + surface.classList.add('mdc-snackbar__surface'); + this.root.appendChild(surface); + this.label = this.document.createElement('div'); + this.label.setAttribute('role', 'status'); + this.label.setAttribute('aria-live', 'polite'); + this.label.classList.add('mdc-snackbar__label'); + surface.appendChild(this.label); + let actions = this.document.createElement('div'); + actions.classList.add('mdc-snackbar__actions'); + surface.appendChild(actions); + this.actionButton = this.document.createElement('button'); + this.actionButton.classList.add('mdc-button'); + this.actionButton.classList.add('mdc-snackbar__action'); + this.actionButton.setAttribute('type', 'button'); + actions.appendChild(this.actionButton); + let ripple = this.document.createElement('div'); + ripple.classList.add('mdc-button__ripple'); + this.actionButton.appendChild(ripple); + this.actionLabel = this.document.createElement('span'); + this.actionLabel.classList.add('mdc-button__label'); + this.actionButton.appendChild(this.actionLabel); + this.document.body.appendChild(this.root); + this.foundation = new MDCSnackbarFoundation(this.adapter); + + this.actionButton.addEventListener('click', this.handleActionClick); + this.root.addEventListener('keydown', this.handleKeyDown); + + this.closed.pipe(takeUntil(this.onDestroy$)).subscribe(reason => this.closeCurrent(reason)); + } + } + + /** @internal */ + onDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); + if (this.foundation) { + this.actionButton!.removeEventListener('click', this.handleActionClick); + this.root!.removeEventListener('keydown', this.handleKeyDown); + this.foundation.destroy(); + this.root!.parentElement!.removeChild(this.root!); + this.root = null; + this.label = null; + this.actionButton = null; + this.actionLabel = null; + } + } + + /** + * Show a snackbar/toast message. If a snackbar message is already showing, the new + * message will be queued to show after earlier message have been shown. + * The returned `MdcSnackbarRef` provides methods to subscribe to opened, closed, and + * action click events. + * + * @param message Queue a snackbar message to show. + */ + show(message: MdcSnackbarMessage): MdcSnackbarRef { + if (!message) + throw new Error('message parameter is not set in call to MdcSnackbarService.show'); + this.init(); + const ref = new MdcSnackbarInfo(message); + this.queue.push(ref); + if (this.queue.length === 1) { + // showing needs to be triggered after snackbarRef is returned to caller, + // so that caller can subscribe to `afterShow` before it is triggered: + Promise.resolve().then(() => { + this.showNext(); + }); + } + return ref; + } + + private showNext() { + if (this.queue.length === 0) + return; + const info = this.queue[0]; + this.label!.textContent = info.message.message || ''; + this.actionLabel!.textContent = info.message.actionText || ''; + if (info.message.stacked) + this.root!.classList.add(CLASS_STACKED); + else + this.root!.classList.remove(CLASS_STACKED); + try { + this.foundation!.setTimeoutMs(info.message.timeout || numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS); + } catch (error) { + console.warn(error.message); + this.foundation!.setTimeoutMs(numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS); + } + this.foundation!.open(); + } + + private closeCurrent(reason: string) { + const info = this.queue.shift(); + info!._closed.next(reason); + info!._opened.complete(); + info!._action.complete(); + info!._closed.complete(); + if (this.queue.length > 0) + this.showNext(); + } + + private get current() { + return this.queue.length > 0 ? this.queue[0] : null; + } + + /** + * Set this property to true to show snackbars start-aligned instead of center-aligned. Desktop and tablet only. + */ + get leading(): boolean { + return this.foundation ? this.root!.classList.contains(CLASS_LEADING) : false; + } + + set leading(value: boolean) { + this.init(); + if (value) + this.root!.classList.add(CLASS_LEADING); + else + this.root!.classList.remove(CLASS_LEADING); + } + + /** + * By default the snackbar closes when the user presses ESC, while it's focused. Set this to + * false to not close the snackbar when the user presses ESC. + */ + get closeOnEscape(): boolean { + return this.foundation ? this.foundation.getCloseOnEscape() : true; + } + + set closeOnEscape(value: boolean) { + this.init(); + this.foundation!.setCloseOnEscape(!!value); + } +} diff --git a/bundle/src/components/switch/mdc.switch.directive.spec.ts b/bundle/src/components/switch/mdc.switch.directive.spec.ts new file mode 100644 index 0000000..d976c5a --- /dev/null +++ b/bundle/src/components/switch/mdc.switch.directive.spec.ts @@ -0,0 +1,291 @@ +import { TestBed, fakeAsync, ComponentFixture, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { MdcSwitchDirective, MdcSwitchInputDirective, MdcSwitchThumbDirective } from './mdc.switch.directive'; +import { By } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; + +describe('MdcSwitchDirective', () => { + it('should render the switch with correct styling and sub-elements', fakeAsync(() => { + const { switchElement } = setup(); + expect(switchElement.classList).toContain('mdc-switch'); + expect(switchElement.children.length).toBe(2); + expect(switchElement.children[0].classList).toContain('mdc-switch__track'); + expect(switchElement.children[1].classList).toContain('mdc-switch__thumb-underlay'); + const thumbUnderlay = switchElement.children[1]; + expect(thumbUnderlay.children.length).toBe(2); + expect(thumbUnderlay.children[0].classList).toContain('mdc-switch__thumb'); + expect(thumbUnderlay.children[1].classList).toContain('mdc-switch__native-control'); + })); + + it('checked can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.checked).toBe(null); + expect(element.checked).toBe(false); + setAndCheck(fixture, 'yes', true); + setAndCheck(fixture, 1, true); + setAndCheck(fixture, true, true); + setAndCheck(fixture, 'false', false); + setAndCheck(fixture, '0', true); + setAndCheck(fixture, false, false); + setAndCheck(fixture, 0, true); + setAndCheck(fixture, null, false); + setAndCheck(fixture, '', true); + })); + + it('checked can be set by user', fakeAsync(() => { + const { fixture, element } = setup(); + + expect(element.checked).toBe(false); + clickAndCheck(fixture, true, false); + clickAndCheck(fixture, false, false); + clickAndCheck(fixture, true, false); + })); + + it('can be disabled', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + testComponent.disabled = true; + fixture.detectChanges(); + expect(element.disabled).toBe(true); + expect(input.disabled).toBe(true); + expect(testComponent.disabled).toBe(true); + const sw = fixture.debugElement.query(By.directive(MdcSwitchDirective)).injector.get(MdcSwitchDirective); + expect(sw['root'].nativeElement.classList).toContain('mdc-switch--disabled'); + + testComponent.disabled = false; + fixture.detectChanges(); + expect(element.disabled).toBe(false); + expect(input.disabled).toBe(false); + expect(testComponent.disabled).toBe(false); + })); + + it('native input can be changed dynamically', fakeAsync(() => { + const { fixture, testComponent } = setup(TestComponentDynamicInput); + + let elements = fixture.nativeElement.querySelectorAll('.mdc-switch__native-control'); + // when no input is present the mdcSwitch renders without an initialized foundation: + expect(elements.length).toBe(0); + + let check = false; + for (let i = 0; i != 3; ++i) { + // render/include one of the inputs: + testComponent.input = i; + fixture.detectChanges(); + // the input should be recognized, the foundation is (re)initialized, + // so we have a fully functional mdcSwitch now: + elements = fixture.nativeElement.querySelectorAll('.mdc-switch__native-control'); + expect(elements.length).toBe(1); + expect(elements[0].classList).toContain('mdc-switch__native-control'); + expect(elements[0].id).toBe(`i${i}`); + // the value of the native input is correctly synced with the testcomponent: + expect(elements[0].checked).toBe(check); + // change the value for the next iteration: + check = !check; + testComponent.checked = check; + fixture.detectChanges(); + expect(elements[0].checked).toBe(check); + } + + // removing input should also work: + testComponent.input = null; + fixture.detectChanges(); + elements = fixture.nativeElement.querySelectorAll('.mdc-switch__native-control'); + // when no input is present the mdcSwitch renders without an initialized foundation: + expect(elements.length).toBe(0); + expect(testComponent.checked).toBe(check); + })); + + it('user interactions are registered in the absence of template bindings', fakeAsync(() => { + const { fixture, element, input } = setup(TestComponentNoBindings); + + expect(element.checked).toBe(false); + expect(input.checked).toBe(false); + clickAndCheckNb(true); + clickAndCheckNb(false); + clickAndCheckNb(true); + + function clickAndCheckNb(expected) { + element.click(); + tick(); fixture.detectChanges(); flush(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + } + })); + + it('aria-checked should reflect state of switch', (() => { + const { fixture, testComponent, element } = setup(); + + expect(element.getAttribute('aria-checked')).toBe('false'); + element.click(); // user change + expect(element.getAttribute('aria-checked')).toBe('true'); + testComponent.checked = false; //programmatic change + fixture.detectChanges(); + expect(element.getAttribute('aria-checked')).toBe('false'); + })); + + it('input should have role=switch attribute', (() => { + const { element } = setup(); + expect(element.getAttribute('role')).toBe('switch'); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expected: boolean) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-switch__native-control'); + const input = fixture.debugElement.query(By.directive(MdcSwitchInputDirective))?.injector.get(MdcSwitchInputDirective); + testComponent.checked = value; + fixture.detectChanges(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + } + + function clickAndCheck(fixture: ComponentFixture, expected: boolean, expectIndeterminate: any) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-switch__native-control'); + const input = fixture.debugElement.query(By.directive(MdcSwitchInputDirective))?.injector.get(MdcSwitchInputDirective); + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(expected); + expect(input.checked).toBe(expected); + expect(testComponent.checked).toBe(expected); + } + + @Component({ + template: ` +
+
+ +
+
+ + ` + }) + class TestComponent { + checked: any = null; + disabled: any = null; + onClick() { + this.checked = !this.checked; + } + } + + @Component({ + template: ` +
+
+ +
+
+ ` + }) + class TestComponentNoBindings { + } + + @Component({ + template: ` +
+
+ + + +
+
+ ` + }) + class TestComponentDynamicInput { + input: number = null; + checked: any = null; + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [MdcSwitchDirective, MdcSwitchInputDirective, MdcSwitchThumbDirective, compType] + }).createComponent(compType); + fixture.detectChanges(); + const testComponent = fixture.debugElement.injector.get(compType); + const input = fixture.debugElement.query(By.directive(MdcSwitchInputDirective))?.injector.get(MdcSwitchInputDirective); + const element = fixture.nativeElement.querySelector('.mdc-switch__native-control'); + const switchElement = fixture.nativeElement.querySelector('.mdc-switch'); + return { fixture, testComponent, input, element, switchElement }; + } +}); + +describe('MdcSwitchDirective with FormsModule', () => { + it('ngModel can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.value).toBe(null); + expect(element.checked).toBe(false); + + // Note that binding to 'ngModel' behaves slightly different from binding to 'checked' + // ngModel coerces values the javascript way: it does !!bindedValue + // checked coerces the string-safe way: value != null && `${value}` !== 'false' + setAndCheck(fixture, 'yes', true); + setAndCheck(fixture, false, false); + setAndCheck(fixture, 'false', true); // the way it works for ngModel... + setAndCheck(fixture, null, false); + setAndCheck(fixture, 1, true); + setAndCheck(fixture, 0, false); + setAndCheck(fixture, '0', true); + })); + + it('ngModel can be changed by updating checked property', fakeAsync(() => { + const { fixture, testComponent, input } = setup(); + + input.checked = true; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(true); + + input.checked = false; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(false); + })); + + it('ngModel can be changed by user', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(true); + expect(input.checked).toBe(true); + expect(testComponent.value).toBe(true); + + element.click(); + tick(); fixture.detectChanges(); + expect(element.checked).toBe(false); + expect(input.checked).toBe(false); + expect(testComponent.value).toBe(false); + })); + + function setAndCheck(fixture: ComponentFixture, value: any, expectedValue: boolean) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-switch__native-control'); + const input = fixture.debugElement.query(By.directive(MdcSwitchInputDirective)).injector.get(MdcSwitchInputDirective); + testComponent.value = value; + fixture.detectChanges(); tick(); + expect(input.checked).toBe(expectedValue); + expect(element.checked).toBe(expectedValue); + expect(testComponent.value).toBe(value); + } + + @Component({ + template: ` +
+ +
+ ` + }) + class TestComponent { + value: any = null; + } + + function setup() { + const fixture = TestBed.configureTestingModule({ + imports: [FormsModule], + declarations: [MdcSwitchInputDirective, MdcSwitchDirective, TestComponent] + }).createComponent(TestComponent); + fixture.detectChanges(); + tick(); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const input = fixture.debugElement.query(By.directive(MdcSwitchInputDirective)).injector.get(MdcSwitchInputDirective); + const element = fixture.nativeElement.querySelector('.mdc-switch__native-control'); + return { fixture, testComponent, input, element }; + } +}); diff --git a/bundle/src/components/switch/mdc.switch.directive.ts b/bundle/src/components/switch/mdc.switch.directive.ts index 6b529f9..5a19570 100644 --- a/bundle/src/components/switch/mdc.switch.directive.ts +++ b/bundle/src/components/switch/mdc.switch.directive.ts @@ -1,83 +1,236 @@ -import { AfterContentInit, Component, ContentChild, Directive, ElementRef, EventEmitter, HostBinding, HostListener, - Input, Optional, Output, Provider, Renderer2, Self, ViewChild, ViewEncapsulation, forwardRef } from '@angular/core'; -import { NgControl } from '@angular/forms'; -import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; -import { asBoolean } from '../../utils/value.utils'; - -/** - * Directive for the input element of an MdcSwitchDirective. - */ -@Directive({ - selector: 'input[mdcSwitchInput][type=checkbox]', - providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcSwitchInputDirective) }] -}) -export class MdcSwitchInputDirective extends AbstractMdcInput { - @HostBinding('class.mdc-switch__native-control') _cls = true; - private _id: string; - private _disabled = false; - - constructor(public _elm: ElementRef, @Optional() @Self() public _cntr: NgControl) { - super(); - } - - /** @docs-private */ - @HostBinding() - @Input() get id() { - return this._id; - } - - set id(value: string) { - this._id = value; - } - - /** @docs-private */ - @HostBinding() - @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; - } - - set disabled(value: any) { - this._disabled = asBoolean(value); - } -} - -/** - * Directive for creating a Material Design switch component. The switch is driven by an - * underlying native checkbox input, which must use the MdcSwitchInputDirective - * directive. - * The current implementation will add all other required DOM elements (such as the - * background). - * Future implementations will also support supplying (customized) background - * elements. - * - * This directive can be used together with an mdcFormField to - * easily position switches and their labels, see - * mdcFormField. - */ -@Directive({ - selector: '[mdcSwitch]' -}) -export class MdcSwitchDirective implements AfterContentInit { - @HostBinding('class.mdc-switch') _cls = true; - @ContentChild(MdcSwitchInputDirective) _input: MdcSwitchInputDirective; - - constructor(private rndr: Renderer2, private root: ElementRef) { - } - - ngAfterContentInit() { - this.addBackground(); - } - - private addBackground() { - let knob = this.rndr.createElement('div'); - this.rndr.addClass(knob, 'mdc-switch__knob'); - let bg = this.rndr.createElement('div'); - this.rndr.addClass(bg, 'mdc-switch__background'); - this.rndr.appendChild(bg, knob); - this.rndr.appendChild(this.root.nativeElement, bg); - } - - @HostBinding('class.mdc-switch--disabled') get _disabled() { - return this._input == null || this._input.disabled; - } -} +import { Directive, ElementRef, HostBinding, Input, Optional, Renderer2, Self, + forwardRef, Output, EventEmitter, OnInit, OnDestroy, ContentChildren, QueryList, HostListener} from '@angular/core'; +import { NgControl } from '@angular/forms'; +import { MDCSwitchFoundation, MDCSwitchAdapter } from '@material/switch'; +import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; +import { asBoolean } from '../../utils/value.utils'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +/** + * Directive for the native input element of an MdcSwitchDirective. + */ +@Directive({ + selector: 'input[mdcSwitchInput][type=checkbox]', + providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcSwitchInputDirective) }] +}) +export class MdcSwitchInputDirective extends AbstractMdcInput implements OnInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-switch__native-control') readonly _cls = true; + /** @internal */ + @HostBinding('attr.role') _role = 'switch'; + private onDestroy$: Subject = new Subject(); + /** @internal */ + @Output() readonly _checkedChange: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly _disabledChange: EventEmitter = new EventEmitter(); + /** @internal */ + @Output() readonly _change: EventEmitter = new EventEmitter(); + private _id: string | null = null; + private _disabled = false; + private _checked = false; + + constructor(public _elm: ElementRef, @Optional() @Self() public _cntr: NgControl) { + super(); + } + + ngOnInit() { + this._cntr?.valueChanges!.pipe(takeUntil(this.onDestroy$)).subscribe((value) => { + this.updateValue(value, true); + }); + } + + ngOnDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); + } + + /** @docs-private */ + @HostBinding() + @Input() get id() { + return this._id; + } + + set id(value: string | null) { + this._id = value; + } + + /** @docs-private */ + @HostBinding() + @Input() get disabled() { + return this._cntr ? !!this._cntr.disabled : this._disabled; + } + + set disabled(value: boolean) { + const newVal = asBoolean(value); + if (newVal != this._disabled) { + this._disabled = asBoolean(newVal); + this._disabledChange.emit(newVal); + } + } + + static ngAcceptInputType_disabled: boolean | ''; + + /** @docs-private */ + @HostBinding() + @Input() get checked(): boolean { + return this._checked; + } + + set checked(value: boolean) { + this.updateValue(value, false); + } + + static ngAcceptInputType_checked: boolean | ''; + + /** @internal */ + @HostListener('change', ['$event']) _onChange(event: Event) { + // update checked value, but not via this.checked, so we bypass events being sent to: + // - _checkedChange -> foundation is already updated via _change + // - _cntr.control.setValue -> control is already updated through its own handling of user events + this._checked = this._elm.nativeElement.checked; // bypass + this._change.emit(event); + } + + private updateValue(value: any, fromControl: boolean) { + // When the 'checked' property is the source of the change, we want to coerce boolean + // values using asBoolean, so that initializing with an attribute with no value works + // as expected. + // When the NgControl is the source of the change we don't want that. The value should + // be interpreted like NgControl/NgForms handles non-boolean values when binding. + const newVal = fromControl ? !!value : asBoolean(value); + if (newVal !== this._checked) { + this._checked = newVal; + this._checkedChange.emit(newVal); + } + if (!fromControl && this._cntr && newVal !== this._cntr.value) { + this._cntr.control!.setValue(newVal); + } + } +} + +/** + * Directive for the mandatory thumb element of an `mdcSwitch`. See `mdcSwitch` for more + * information. + */ +@Directive({ + selector: '[mdcSwitchThumb]' +}) +export class MdcSwitchThumbDirective { + /** @internal */ + @HostBinding('class.mdc-switch__thumb-underlay') readonly _cls = true; + + constructor(private elm: ElementRef, private rndr: Renderer2) { + this.addThumb(); + } + + private addThumb() { + const thumb = this.rndr.createElement('div'); + this.rndr.addClass(thumb, 'mdc-switch__thumb'); + this.rndr.appendChild(this.elm.nativeElement, thumb); + } +} + +/** + * Directive for creating a Material Design switch component. The switch is driven by an + * underlying native checkbox input, which must use the `mdcSwitchInput` directive. The + * `mdcSwitchInput` must be wrapped by an `mdcSwitchThumb`, which must be a direct child of this + * `mdcSwitch` directive. + * + * The current implementation will add all other required DOM elements (such as the + * switch-track). Future implementations will also support supplying (customized) elements + * for those. + * + * This directive can be used together with an mdcFormField to + * easily position switches and their labels, see + * mdcFormField. + */ +@Directive({ + selector: '[mdcSwitch]' +}) +export class MdcSwitchDirective { + /** @internal */ + @HostBinding('class.mdc-switch') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + private onInputChange$: Subject = new Subject(); + /** @internal */ + @ContentChildren(MdcSwitchInputDirective, {descendants: true}) _inputs?: QueryList; + private mdcAdapter: MDCSwitchAdapter = { + addClass: (className: string) => { + this.rndr.addClass(this.root.nativeElement, className); + }, + removeClass: (className: string) => { + this.rndr.removeClass(this.root.nativeElement, className); + }, + setNativeControlAttr: (attr: string, value: string) => this.rndr.setAttribute(this._input!._elm.nativeElement, attr, value), + setNativeControlChecked: () => undefined, // nothing to do, checking/unchecking is done directly on the input + setNativeControlDisabled: () => undefined // nothing to do, enabling/disabling is done directly on the input + }; + private foundation: MDCSwitchFoundation | null = null; + + constructor(private rndr: Renderer2, private root: ElementRef) { + this.addTrack(); + } + + ngAfterContentInit() { + if (this._input) { + this.initFoundation(); + } + this._inputs!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + if (this.foundation) + this.foundation.destroy(); + if (this._input) + this.initFoundation(); + else + this.foundation = null; + this.subscribeInputChanges(); + }); + this.subscribeInputChanges(); + } + + ngOnDestroy() { + this.onInputChange$.next(); this.onInputChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + if (this.foundation) { + this.foundation.destroy(); + this.foundation = null; + } + } + + private initFoundation() { + this.foundation = new MDCSwitchFoundation(this.mdcAdapter); + this.foundation.init(); + // The foundation doesn't correctly set the aria-checked attribute and the checked/disabled styling + // on initialization. So let's help it to not forget that: + this.foundation.setChecked(this._input!.checked); + this.foundation.setDisabled(this._input!.disabled); + } + + private addTrack() { + const track = this.rndr.createElement('div'); + this.rndr.addClass(track, 'mdc-switch__track'); + this.rndr.appendChild(this.root.nativeElement, track); + } + + + private subscribeInputChanges() { + this.onInputChange$.next(); + this._input?._checkedChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(checked => this.foundation?.setChecked(checked)); + this._input?._disabledChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe(disabled => { + this.foundation?.setDisabled(disabled); + }); + this._input?._change.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe((event) => { + this.foundation?.handleChange(event); + }); + } + + private get _input() { + return this._inputs && this._inputs.length > 0 ? this._inputs.first : null; + } +} + +export const SWITCH_DIRECTIVES = [ + MdcSwitchInputDirective, + MdcSwitchThumbDirective, + MdcSwitchDirective +]; diff --git a/bundle/src/components/tab/mdc.tab.bar.directive.spec.ts b/bundle/src/components/tab/mdc.tab.bar.directive.spec.ts new file mode 100644 index 0000000..5f854c5 --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.bar.directive.spec.ts @@ -0,0 +1,182 @@ +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { MdcTabBarDirective, TAB_BAR_DIRECTIVES } from './mdc.tab.bar.directive'; +import { TAB_SCROLLER_DIRECTIVES } from './mdc.tab.scroller.directive'; +import { TAB_DIRECTIVES } from './mdc.tab.directive'; +import { TAB_INDICATOR_DIRECTIVES } from './mdc.tab.indicator.directive'; +import { By } from '@angular/platform-browser'; +import { simulateKey } from '../../testutils/page.test'; + +const template = ` +
+
+
+
+ +
+
+
+
+` + +const templateDynamic = ` +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+`; + +describe('MdcTabScrollerDirective', () => { + abstract class AbstractTestComponent { + } + + @Component({ + template: template + }) + class TestComponent extends AbstractTestComponent { + tabs = [ + {icon: 'access_time', label: 'recents'}, + {icon: 'near_me', label: 'nearby'}, + {icon: 'favorite', label: 'favorites'} + ]; + } + + @Component({ + template: templateDynamic + }) + class DynamicTestComponent extends AbstractTestComponent { + scrollerA = true; + tabsA = [ + {icon: 'access_time', label: 'recents'}, + {icon: 'near_me', label: 'nearby'}, + {icon: 'favorite', label: 'favorites'} + ]; + tabsB = [ + {icon: 'access_time', label: 'recents'}, + {icon: 'favorite', label: 'favorites'} + ]; + } + + function setup(testComponentType: any = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...TAB_INDICATOR_DIRECTIVES, ...TAB_DIRECTIVES, ...TAB_SCROLLER_DIRECTIVES, ...TAB_BAR_DIRECTIVES, testComponentType] + }).createComponent(testComponentType); + fixture.detectChanges(); tick(100); + return { fixture }; + } + + it('should initialize with defaults', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const bar: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-bar'); + + expect(bar).toBeDefined(); + expect(bar.getAttribute('role')).toBe('tablist'); + })); + + it('tabs can be activated by interaction', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, false, false]); + + tabs[1].click(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true, false]); + + tabs[2].click(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, false, true]); + })); + + it('tabs can be focused with arrow keys', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + const ripples: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab__ripple')]; + tabs[1].click(); tick(20); fixture.detectChanges(); + expect(document.activeElement).toBe(tabs[1]); + simulateKey(tabs[1], 'ArrowRight'); + tick(20); fixture.detectChanges(); // (styles are applied via requestAnimationFrame) + expect(document.activeElement).toBe(tabs[2]); + })); + + it('foundation correctly reinitialized when scroller is changed', fakeAsync(() => { + const { fixture } = setup(DynamicTestComponent); + + let tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + const testComponent = fixture.debugElement.injector.get(DynamicTestComponent); + const mdcTabBar = fixture.debugElement.query(By.directive(MdcTabBarDirective)).injector.get(MdcTabBarDirective); + const foundation = getFoundation(mdcTabBar); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, false, false]); + + tabs[1].click(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true, false]); + // foundation should not have changed: + expect(foundation).toBe(getFoundation(mdcTabBar)); + + testComponent.scrollerA = false; // switch scroller + fixture.detectChanges(); tick(100); + tabs = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + // tabs changed, no tab is active anymore: + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, false]); + // foundation should have been reconstructed: + expect(foundation).not.toBe(getFoundation(mdcTabBar)); + })); + + it('foundation correctly reinitialized when tabs are added', fakeAsync(() => { + const { fixture } = setup(DynamicTestComponent); + + let tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + const testComponent = fixture.debugElement.injector.get(DynamicTestComponent); + const mdcTabBar = fixture.debugElement.query(By.directive(MdcTabBarDirective)).injector.get(MdcTabBarDirective); + const foundation = getFoundation(mdcTabBar); + tabs[1].click(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true, false]); + + testComponent.tabsA.push( {icon: 'explore', label: 'explore'}) + fixture.detectChanges(); tick(100); + tabs = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + // tabs changed, but second tab is still active: + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true, false, false]); + // foundation should have been reconstructed: + expect(foundation).not.toBe( mdcTabBar['_foundation']); + })); + + function getFoundation(mdcTabBar: MdcTabBarDirective) { + const foundation = mdcTabBar['_foundation']; + expect(foundation.handleKeyDown).toBeDefined(); + return foundation; + } +}); diff --git a/bundle/src/components/tab/mdc.tab.bar.directive.ts b/bundle/src/components/tab/mdc.tab.bar.directive.ts new file mode 100644 index 0000000..4207cc4 --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.bar.directive.ts @@ -0,0 +1,147 @@ +import { ContentChildren, EventEmitter, QueryList, Directive, ElementRef, HostBinding, Output, HostListener, + AfterContentInit, OnDestroy, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Subject, Subscription } from 'rxjs'; +import { MDCTabBarFoundation, MDCTabBarAdapter } from '@material/tab-bar'; +import { AbstractMdcTabDirective, MdcTabChange } from './mdc.tab.directive'; +import { MdcTabScrollerDirective } from './mdc.tab.scroller.directive'; +import { takeUntil } from 'rxjs/operators'; + +/** + * Directive for a tab bar. This directive must have an `mdcTabScroller` as only child. + */ +@Directive({ + selector: '[mdcTabBar]' +}) +export class MdcTabBarDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-tab-bar') readonly _cls = true; + private document: Document; + /** @internal */ + @HostBinding('attr.role') _role = 'tablist'; + private onDestroy$: Subject = new Subject(); + private onTabsChange$: Subject = new Subject(); + /** @internal */ + @ContentChildren(MdcTabScrollerDirective) _scrollers?: QueryList; + /** + * Event emitted when the active tab changes. + */ + @Output() readonly tabChange: EventEmitter = new EventEmitter(); + private _adapter: MDCTabBarAdapter = { + scrollTo: (scrollX) => this._scroller!._foundation!.scrollTo(scrollX), + incrementScroll: (scrollXIncrement) => this._scroller!._foundation!.incrementScroll(scrollXIncrement), + getScrollPosition: () => this._scroller!._foundation!.getScrollPosition(), + getScrollContentWidth: () => this._scroller!._getScrollContentWidth(), + getOffsetWidth: () => (this._el.nativeElement as HTMLElement).offsetWidth, + isRTL: () => getComputedStyle(this._el.nativeElement).getPropertyValue('direction') === 'rtl', + setActiveTab: (index) => this._foundation!.activateTab(index), + activateTabAtIndex: (index, clientRect) => this._tabs!.toArray()[index]._activate(index, clientRect), + deactivateTabAtIndex: (index) => this._tabs!.toArray()[index]._deactivate(), + focusTabAtIndex: (index) => this._tabs!.toArray()[index]._focus(), + getTabIndicatorClientRectAtIndex: (index) => this._tabs!.toArray()[index]._computeIndicatorClientRect()!, + getTabDimensionsAtIndex: (index) => this._tabs!.toArray()[index]._computeDimensions()!, + getPreviousActiveTabIndex: () => this._tabs!.toArray().findIndex(e => e.isActive()), + getFocusedTabIndex: () => this._tabs!.map(t => t._root.nativeElement).indexOf(this.document.activeElement), + getIndexOfTabById: () => -1, // we're not using the id's, and nothing should call getIndexOfTabById + getTabListLength: () => this._tabs!.length, + notifyTabActivated: (tabIndex) => this.tabChange.emit({tab: this._tabs!.toArray()[tabIndex], tabIndex}) + }; + private _subscriptions: Subscription[] = []; + private _foundation: MDCTabBarFoundation | null = null; + + constructor(public _el: ElementRef, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; + } + + ngAfterContentInit() { + let scrollersObservable$ = this._scrollers!.changes.pipe(takeUntil(this.onDestroy$)); + const tabChangeInit = () => { + if (this._tabs) { + this._tabs.changes.pipe( + takeUntil(scrollersObservable$), takeUntil(this.onDestroy$) + ).subscribe(() => { + this.onTabsChange$.next(); + }); + } + } + scrollersObservable$.subscribe(() => { + this.onTabsChange$.next(); + tabChangeInit(); + }); + tabChangeInit(); + + this.onTabsChange$.pipe( + takeUntil(this.onDestroy$) + ).subscribe(() => { + this.destroyFoundation(); + if (this._tabs) + this.initFoundation(); + }); + if (this._tabs) + this.initFoundation(); + } + + ngOnDestroy() { + this.onTabsChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + this.destroyFoundation(); + } + + private initFoundation() { + this._foundation = new MDCTabBarFoundation(this._adapter); + this._foundation.init(); + this._listenTabSelected(); + } + + private destroyFoundation() { + this._unlistenTabSelected(); + let destroy = this._foundation != null; + if (destroy) { + this._foundation!.destroy(); + } + this._foundation = null; + return destroy; + } + + private _listenTabSelected() { + this._unlistenTabSelected(); + this._subscriptions = new Array(); + this._tabs?.forEach(tab => { + this._subscriptions!.push(tab.activationRequest$.subscribe(activated => { + if (activated) + this._setActive(tab); + })); + }); + } + + private _unlistenTabSelected() { + this._subscriptions.forEach(sub => sub.unsubscribe()); + this._subscriptions = []; + } + + private _setActive(tab: AbstractMdcTabDirective) { + if (this._foundation && this._tabs) { + let index = this._tabs.toArray().indexOf(tab); + // This is what foundation.handleTabInteraction would do, but more accessible, without + // the need for assigned tabIds: + if (index >= 0) + this._adapter.setActiveTab(index); + } + } + + /** @internal */ + @HostListener('keydown', ['$event']) _handleInteraction(event: KeyboardEvent) { + if (this._foundation) + this._foundation.handleKeyDown(event); + } + + private get _scroller() { + return this._scrollers && this._scrollers.length > 0 ? this._scrollers.first : null; + } + + private get _tabs() { + return this._scroller ? this._scroller._tabs : null; + } +} + +export const TAB_BAR_DIRECTIVES = [MdcTabBarDirective]; diff --git a/bundle/src/components/tab/mdc.tab.directive.spec.ts b/bundle/src/components/tab/mdc.tab.directive.spec.ts new file mode 100644 index 0000000..2900ec4 --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.directive.spec.ts @@ -0,0 +1,174 @@ +import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { TAB_DIRECTIVES, MdcTabDirective } from './mdc.tab.directive'; +import { TAB_INDICATOR_DIRECTIVES } from './mdc.tab.indicator.directive'; +import { hasRipple } from '../../testutils/page.test'; + +const template = ` + +`; + +const templateIndicatorSpanning = ` + +`; + +describe('MdcTabDirective', () => { + abstract class AbstractTestComponent { + events: any[] = []; + active: boolean = null; + activate(event: any) { + this.events.push(event); + } + } + + @Component({ + template: template + }) + class TestComponent extends AbstractTestComponent { + } + + @Component({ + template: templateIndicatorSpanning + }) + class SpanningTestComponent extends AbstractTestComponent { + } + + function setup(testComponentType: any = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...TAB_INDICATOR_DIRECTIVES, ...TAB_DIRECTIVES, testComponentType] + }).createComponent(testComponentType); + fixture.detectChanges(); + return { fixture }; + } + + it('should initialize with defaults', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tab: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab'); + expect(tab).toBeDefined(); + expect(tab.classList).not.toContain('mdc-tab--active'); + expect(tab.getAttribute('aria-selected')).toBe('false'); + expect(tab.getAttribute('tabindex')).toBe('-1'); + expect(fixture.nativeElement.querySelector('.mdc-tab__content').classList).toBeDefined(); + expect(fixture.nativeElement.querySelector('.mdc-tab__icon').classList).toBeDefined(); + expect(fixture.nativeElement.querySelector('.mdc-tab__text-label').classList).toBeDefined(); + expect(fixture.nativeElement.querySelector('.mdc-tab-indicator').classList).toBeDefined(); + expect(fixture.nativeElement.querySelector('.mdc-tab-indicator__content').classList).toBeDefined(); + // ripple styling is on the ripple surface element: + expect(hasRipple(fixture.nativeElement.querySelector('.mdc-tab__ripple'))).toBe(true, 'the ripple element should be attached'); + })); + + it('tab can be activated and deactivated', (() => { + const { fixture } = setup(TestComponent); + validateActivation(fixture, TestComponent); + })); + + it('indicator spanning tab activation and deactivation', (() => { + const { fixture } = setup(SpanningTestComponent); + validateActivation(fixture, SpanningTestComponent); + })); + + it('click triggers activationRequest', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tab: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab'); + const mdcTab = fixture.debugElement.query(By.directive(MdcTabDirective)).injector.get(MdcTabDirective); + const events = []; + const subscription = mdcTab.activationRequest$.subscribe(activation => events.push(activation)); + try { + expect(events).toEqual([false]); + tab.click(); tick(); fixture.detectChanges(); + expect(events).toEqual([false, true]); + } finally { + subscription.unsubscribe(); + } + })); + + it('active property triggers activationRequest', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tab: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab'); + const mdcTab = fixture.debugElement.query(By.directive(MdcTabDirective)).injector.get(MdcTabDirective); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const events = []; + const subscription = mdcTab.activationRequest$.subscribe(activation => events.push(activation)); + try { + expect(events).toEqual([false]); + + testComponent.active = true; tick(); fixture.detectChanges(); + expect(events).toEqual([false, true]); + + testComponent.active = false; tick(); fixture.detectChanges(); + expect(events).toEqual([false, true, false]); + + testComponent.active = true; tick(); fixture.detectChanges(); + expect(events).toEqual([false, true, false, true]); + + testComponent.active = true; tick(); fixture.detectChanges(); + expect(events).toEqual([false, true, false, true]); // no value change => no new event + } finally { + subscription.unsubscribe(); + } + })); + + function validateActivation(fixture: ComponentFixture, testComponentType: any = TestComponent) { + const tab: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab'); + const mdcTab = fixture.debugElement.query(By.directive(MdcTabDirective)).injector.get(MdcTabDirective); + const testComponent = fixture.debugElement.injector.get(testComponentType); + expect(testComponent.events).toEqual([]); + + validateActive(tab, mdcTab, false); + expect(testComponent.events).toEqual([]); + + mdcTab._activate(0); fixture.detectChanges(); + validateActive(tab, mdcTab); + expect(testComponent.events).toEqual([{tab: mdcTab, tabIndex: 0}]); + testComponent.events = []; + + // changing active property should not do anything (but send a message to the parent, + // so that it can deactivate the right tab and activate this one): + testComponent.active = false; fixture.detectChanges(); + validateActive(tab, mdcTab); + expect(testComponent.events).toEqual([]); + + mdcTab._deactivate(); fixture.detectChanges(); + validateActive(tab, mdcTab, false); + expect(testComponent.events).toEqual([]); + + testComponent.active = true; fixture.detectChanges(); + validateActive(tab, mdcTab, false); // as above: active property should not affect state by itself + expect(testComponent.events).toEqual([]); + } + + function validateActive(tab: HTMLElement, mdcTab: MdcTabDirective, active = true, focusOnActivate = true) { + const indicator: HTMLElement = tab.querySelector('.mdc-tab-indicator'); + expect(mdcTab.active).toBe(active); + if (active) { + expect(tab.classList).toContain('mdc-tab--active'); + expect(indicator.classList).toContain('mdc-tab-indicator--active'); + expect(tab.getAttribute('aria-selected')).toBe('true'); + expect(tab.getAttribute('tabindex')).toBe('0'); + if (focusOnActivate) + expect(document.activeElement).toBe(tab); + } else { + expect(tab.classList).not.toContain('mdc-tab--active'); + expect(indicator.classList).not.toContain('mdc-tab-indicator--active'); + expect(tab.getAttribute('aria-selected')).toBe('false'); + expect(tab.getAttribute('tabindex')).toBe('-1'); + } + } +}); diff --git a/bundle/src/components/tab/mdc.tab.directive.ts b/bundle/src/components/tab/mdc.tab.directive.ts new file mode 100644 index 0000000..9a302cf --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.directive.ts @@ -0,0 +1,252 @@ +import { AfterContentInit, ContentChildren, EventEmitter, forwardRef, Directive, ElementRef, + HostBinding, Input, OnDestroy, Output, Renderer2, QueryList, HostListener, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { MDCTabFoundation, MDCTabAdapter } from '@material/tab'; +import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; +import { asBoolean } from '../../utils/value.utils'; +import { MdcEventRegistry } from '../../utils/mdc.event.registry'; +import { MdcTabIndicatorDirective } from './mdc.tab.indicator.directive'; +import { takeUntil } from 'rxjs/operators'; +import { ReplaySubject, Subject } from 'rxjs'; + +/** + * The interface for events send by the activate output of an + * `mdcTab` directive, or by the tabChange output of an mdcTabBar. + */ +export interface MdcTabChange { + /** + * A reference to the tab that sends the event. + */ + tab: AbstractMdcTabDirective, + /** + * The index of the tab that sends the event. + */ + tabIndex: number +} + +/** + * Directive for an optional icon when having a tab bar with icons. + * This directive must be used as a child of an `mdcTabContent`, and as a sibbling + * to a following `mdcTabLabel`. + */ +@Directive({ + selector: '[mdcTabIcon]' +}) +export class MdcTabIconDirective { + /** @internal */ + @HostBinding('class.mdc-tab__icon') readonly _cls = true; + /** @internal */ + @HostBinding('attr.aria-hidden') _ariaHidden = true; +} + +/** + * Directive for the text label of a tab. + * This directive must be used as a child of an `mdcTabContent`. + * It can be preceded by an optional `mdcTabIcon`. + */ +@Directive({ + selector: '[mdcTabLabel]' +}) +export class MdcTabLabelDirective { + /** @internal */ + @HostBinding('class.mdc-tab__text-label') readonly _cls = true; +} + +/** + * Directive for the content (label and optional icon of the tab). + * This directive must be used as a child of an `mdcTab`, and + * can contain an (optional) `mdcTabIcon` and an `mdcTabLabel`. + */ +@Directive({ + selector: '[mdcTabContent]' +}) +export class MdcTabContentDirective { + /** @internal */ + @HostBinding('class.mdc-tab__content') readonly _cls = true; + + constructor(public _root: ElementRef) {} +} + +@Directive() +export abstract class AbstractMdcTabDirective extends AbstractMdcRipple implements OnDestroy, AfterContentInit { + /** @internal */ + @HostBinding('class.mdc-tab') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + /** @internal */ + protected _active: ClientRect | boolean = false; + /** @internal */ + @HostBinding('attr.role') _role = 'tab'; + /** @internal */ + @ContentChildren(MdcTabContentDirective) _contents?: QueryList; + /** @internal */ + @ContentChildren(MdcTabIndicatorDirective, {descendants: true}) _indicators?: QueryList; + /** + * Event called when the tab is activated. + */ + @Output() readonly activate: EventEmitter = new EventEmitter(); + private activationRequest: Subject = new ReplaySubject(1); + /** @internal */ + protected _adapter: MDCTabAdapter = { + addClass: (className) => this._rndr.addClass(this._root.nativeElement, className), + removeClass: (className) => this._rndr.removeClass(this._root.nativeElement, className), + hasClass: (className) => this._root.nativeElement.classList.contains(className), + setAttr: (attr, value) => this._rndr.setAttribute(this._root.nativeElement, attr, value), + activateIndicator: (previousIndicatorClientRect) => this._indicator?.activate(previousIndicatorClientRect), + deactivateIndicator: () => this._indicator?.deactivate(), + notifyInteracted: () => this.activationRequest.next(true), + getOffsetLeft: () => this._root.nativeElement.offsetLeft, + getOffsetWidth: () => this._root.nativeElement.offsetWidth, + getContentOffsetLeft: () => this._content!._root.nativeElement.offsetLeft, + getContentOffsetWidth: () => this._content!._root.nativeElement.offsetWidth, + focus: () => this._root.nativeElement.focus() + }; + /** @internal */ + _foundation: MDCTabFoundation | null = null; + + constructor(protected _rndr: Renderer2, public _root: ElementRef, protected _registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(_root, _rndr, _registry, doc as Document); + } + + ngAfterContentInit() { + this.addRippleSurface('mdc-tab__ripple'); + this.initRipple(); + + let initializer = () => { + this.destroyFoundation(); + if (this._content && this._indicator) + this.initFoundation(); + }; + initializer(); + this._contents!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); + this._indicators!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); + } + + ngOnDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); + this.destroyRipple(); + this.destroyFoundation(); + } + + private destroyFoundation() { + let destroy = this._foundation != null; + if (destroy) + this._foundation!.destroy(); + this._foundation = null; + return destroy; + } + + private initFoundation() { + this._foundation = new MDCTabFoundation(this._adapter); + this._foundation.init(); + if (this._active) { + let clientRect = typeof this._active === 'boolean' ? undefined : this._active; + this._foundation.activate(clientRect); + } else { + // foundation doesn't initialize these attributes: + this._rndr.setAttribute(this._root.nativeElement, 'aria-selected', 'false'); + this._rndr.setAttribute(this._root.nativeElement, 'tabindex', '-1'); + } + } + + /** @internal */ + protected getRippleStylingElement() { + return this.rippleSurface; + } + + /** @internal */ + _activate(tabIndex: number, previousIndicatorClientRect?: ClientRect) { + this._active = previousIndicatorClientRect || true; + if (this._foundation) + this._foundation.activate(previousIndicatorClientRect); + this.activate.emit({tab: this, tabIndex}); + } + + /** @internal */ + _deactivate() { + this._active = false; + if (this._foundation) + this._foundation.deactivate(); + } + + /** @internal */ + _focus() { + this._adapter.focus(); + } + + /** @internal */ + _computeIndicatorClientRect() { + return this._indicator?._computeContentClientRect(); + } + + /** @internal */ + _computeDimensions() { + return this._foundation?.computeDimensions(); + } + + /** @internal */ + isActive() { + return !!this._active; + } + + /** @internal */ + triggerActivation(value: boolean = true) { + // Note: this should not set the _active property. It just notifies the tab-bar + // that it wants to be activated. The tab-bar will deactivate the previous tab, and activate + // this one. + this.activationRequest.next(value); + } + + /** @internal */ + get activationRequest$() { + return this.activationRequest.asObservable(); + } + + /** @internal */ + @HostListener('click') _onClick() { + if (this._foundation) + this._foundation.handleClick(); + } + + /** @internal */ + private get _indicator() { + return this._indicators && this._indicators.length > 0 ? this._indicators.first : null; + } + + /** @internal */ + private get _content() { + return this._contents && this._contents.length > 0 ? this._contents.first : null; + } +} + +/** + * Directive for a tab. This directive must be used as a child of mdcTabBar. + * When using tabs in combination with angular routes, add a `routerLink` property, so that + * the `MdcTabRouterDirective` is selected instead of this directive. + */ +@Directive({ + selector: '[mdcTab]:not([routerLink])', + exportAs: 'mdcTab', + providers: [{provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabDirective) }] +}) +export class MdcTabDirective extends AbstractMdcTabDirective { + constructor(rndr: Renderer2, root: ElementRef, registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(rndr, root, registry, doc as Document); + } + + /** + * Input for activating the tab. Assign a truthy value to activate the tab. A falsy value + * will have no effect. In order to deactivate the tab, you must activate another tab. + */ + @Input() get active() { + return this.isActive(); + } + + set active(value: boolean) { + this.triggerActivation(asBoolean(value)); + } + + static ngAcceptInputType_active: boolean | ''; +} + +export const TAB_DIRECTIVES = [MdcTabIconDirective, MdcTabLabelDirective, MdcTabContentDirective, MdcTabDirective]; diff --git a/bundle/src/components/tab/mdc.tab.indicator.directive.spec.ts b/bundle/src/components/tab/mdc.tab.indicator.directive.spec.ts new file mode 100644 index 0000000..7164eac --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.indicator.directive.spec.ts @@ -0,0 +1,98 @@ +import { TestBed, fakeAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { MdcTabIndicatorDirective, TAB_INDICATOR_DIRECTIVES } from './mdc.tab.indicator.directive'; + +const template = ` + + {{contentType === 'icon' ? 'favorite' : ''}} + +`; + +// TODO: change nested content, check correct reinitialization and state of mdc-tab-indicator--active + +describe('MdcTabIndicatorDirective', () => { + abstract class AbstractTestComponent { + type: string = null; + contentType: string = null; + } + + @Component({ + template: template + }) + class TestComponent extends AbstractTestComponent { + } + + function setup(testComponentType: any = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...TAB_INDICATOR_DIRECTIVES, testComponentType] + }).createComponent(testComponentType); + fixture.detectChanges(); + return { fixture }; + } + + @Component({ + template: template + }) + class UninitializedTestComponent { + } + + it('should initialize with defaults', (() => { + const { fixture } = setup(UninitializedTestComponent); + const indicator: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-indicator'); + expect(indicator).toBeDefined(); + expect(indicator.classList).not.toContain('mdc-tab-indicator--fade'); + const content: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-indicator__content'); + expect(content).toBeDefined(); + expect(content.classList).toContain('mdc-tab-indicator__content--underline'); + expect(content.classList).not.toContain('mdc-tab-indicator__content--icon'); + })); + + it('indicator can be activated and deactivated', (() => { + const { fixture } = setup(UninitializedTestComponent); + const indicator: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-indicator'); + expect(indicator.classList).not.toContain('mdc-tab-indicator--active'); + const mdcIndicator = fixture.debugElement.query(By.directive(MdcTabIndicatorDirective)).injector.get(MdcTabIndicatorDirective); + + mdcIndicator.activate(null); fixture.detectChanges(); + expect(indicator.classList).toContain('mdc-tab-indicator--active'); + + mdcIndicator.deactivate(); fixture.detectChanges(); + expect(indicator.classList).not.toContain('mdc-tab-indicator--active'); + })); + + it('indicator type can be changed', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const indicator: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-indicator'); + const testComponent = fixture.debugElement.injector.get(TestComponent); + expect(indicator.classList).not.toContain('mdc-tab-indicator--fade'); + + testComponent.type = 'fade'; fixture.detectChanges(); + expect(indicator.classList).toContain('mdc-tab-indicator--fade'); + + testComponent.type = 'underline'; fixture.detectChanges(); + expect(indicator.classList).not.toContain('mdc-tab-indicator--fade'); + })); + + it('indicatorContent type can be changed', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const content: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-indicator__content'); + const testComponent = fixture.debugElement.injector.get(TestComponent); + const mdcIndicator = fixture.debugElement.query(By.directive(MdcTabIndicatorDirective)).injector.get(MdcTabIndicatorDirective); + expect(content.classList).toContain('mdc-tab-indicator__content--underline'); + expect(content.classList).not.toContain('mdc-tab-indicator__content--icon'); + + testComponent.contentType = 'icon'; fixture.detectChanges(); + expect(content.classList).not.toContain('mdc-tab-indicator__content--underline'); + expect(content.classList).toContain('mdc-tab-indicator__content--icon'); + + mdcIndicator.activate(null); + + testComponent.contentType = 'underline'; fixture.detectChanges(); + expect(content.classList).toContain('mdc-tab-indicator__content--underline'); + expect(content.classList).not.toContain('mdc-tab-indicator__content--icon'); + + mdcIndicator.deactivate(); + })); +}); diff --git a/bundle/src/components/tab/mdc.tab.indicator.directive.ts b/bundle/src/components/tab/mdc.tab.indicator.directive.ts new file mode 100644 index 0000000..415221a --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.indicator.directive.ts @@ -0,0 +1,163 @@ +import { AfterContentInit, ContentChildren, Directive, ElementRef, + HostBinding, Input, OnDestroy, Renderer2, QueryList } from '@angular/core'; +import { MDCTabIndicatorFoundation, MDCFadingTabIndicatorFoundation, MDCSlidingTabIndicatorFoundation, MDCTabIndicatorAdapter } from '@material/tab-indicator'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; + +/** + * Child directive for an `mdcTabIndicator`. Must be present, and can be assigned + * the value `underline` (default), or `icon`, to set the type of indicator. + */ +@Directive({ + selector: '[mdcTabIndicatorContent]' +}) +export class MdcTabIndicatorContentDirective { + /** @internal */ + @HostBinding('class.mdc-tab-indicator__content') readonly _cls = true; + /** @internal */ + _type: 'underline' | 'icon' = 'underline'; + + constructor(public _root: ElementRef) {} + + /** + * By default the indicator is represented as an underline. Set this value to + * `icon` to have it represented as an icon. + * You can use SVG, or font icon libraries to set the content icon. + */ + @Input() get mdcTabIndicatorContent() { + return this._type; + } + + set mdcTabIndicatorContent(value: 'underline' | 'icon') { + this._type = value === 'icon' ? value : 'underline' + } + + static ngAcceptInputType_mdcTabIndicatorContent: 'underline' | 'icon' | ''; + + @HostBinding('class.mdc-tab-indicator__content--underline') get _underline() { + return this._type === 'underline'; + } + + @HostBinding('class.mdc-tab-indicator__content--icon') get _icon() { + return this._type === 'icon'; + } +} + +/** + * Directive for the content (label and optional icon of the tab). + * This directive must be used as a child of an `mdcTab`, or `mdcTabRouter`. + */ +@Directive({ + selector: '[mdcTabIndicator]' +}) +export class MdcTabIndicatorDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-tab-indicator') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + /** @internal */ + @ContentChildren(MdcTabIndicatorContentDirective) _contents?: QueryList; + /** @internal */ + _type: 'slide' | 'fade' = 'slide'; + private active: ClientRect | boolean = false; + + private mdcAdapter: MDCTabIndicatorAdapter = { + addClass: (className) => { + this.rndr.addClass(this.root.nativeElement, className); + }, + removeClass: (className) => { + this.rndr.removeClass(this.root.nativeElement, className); + }, + computeContentClientRect: () => this._content!._root.nativeElement.getBoundingClientRect(), + setContentStyleProperty: (name, value) => this.rndr.setStyle(this._content!._root.nativeElement, name, value) + }; + private foundation: MDCTabIndicatorFoundation | null = null; + + constructor(private rndr: Renderer2, private root: ElementRef) {} + + ngAfterContentInit() { + if (this._content) { + this.initFoundation(); + } + this._contents!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + this.destroyFoundation(); + if (this._content) + this.initFoundation(); + }); + } + + ngOnDestroy() { + this.onDestroy$.next(); this.onDestroy$.complete(); + this.destroyFoundation(); + } + + private destroyFoundation() { + let destroy = this.foundation != null; + if (destroy) { + this.foundation!.destroy(); + this.mdcAdapter.removeClass('mdc-tab-indicator--active'); + } + this.foundation = null; + return destroy; + } + + private initFoundation() { + this.foundation = this._type === 'fade' ? + new MDCFadingTabIndicatorFoundation(this.mdcAdapter) : + new MDCSlidingTabIndicatorFoundation(this.mdcAdapter); + this.foundation.init(); + if (this.active) { + let clientRect = typeof this.active === 'boolean' ? undefined : this.active; + this.foundation.activate(clientRect); + } + } + + /** + * By default the indicator is a sliding indicator: when another tab is activated, the indicator + * animates a slide to the new tab. Set this property `fade` to have a fading animation + * instead. + */ + @Input() get mdcTabIndicator() { + return this._type; + } + + set mdcTabIndicator(value: 'slide' | 'fade') { + let newValue: 'slide' | 'fade' = value === 'fade' ? value : 'slide' + if (newValue !== this._type) { + this._type = newValue; + if (this.destroyFoundation()) + this.initFoundation(); + } + } + + static ngAcceptInputType_mdcTabIndicator: 'slide' | 'fade' | ''; + + /** @internal */ + activate(previousIndicatorClientRect: ClientRect | undefined) { + this.active = previousIndicatorClientRect || true; + if (this.foundation) + this.foundation.activate(previousIndicatorClientRect); + } + + /** @internal */ + deactivate() { + this.active = false; + if (this.foundation) + this.foundation.deactivate(); + } + + /** @internal */ + @HostBinding('class.mdc-tab-indicator--fade') get _slide() { + return this._type === 'fade'; + } + + private get _content() { + return this._contents && this._contents.length > 0 ? this._contents.first : null; + } + + /** @internal */ + _computeContentClientRect() { + return this.foundation?.computeContentClientRect(); + } +} + +export const TAB_INDICATOR_DIRECTIVES = [MdcTabIndicatorContentDirective, MdcTabIndicatorDirective]; diff --git a/bundle/src/components/tab/mdc.tab.router.directive.spec.ts b/bundle/src/components/tab/mdc.tab.router.directive.spec.ts new file mode 100644 index 0000000..f459b9c --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.router.directive.spec.ts @@ -0,0 +1,183 @@ +import { TestBed, fakeAsync, tick, flush } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { Component } from '@angular/core'; +import { TAB_BAR_DIRECTIVES } from './mdc.tab.bar.directive'; +import { TAB_SCROLLER_DIRECTIVES } from './mdc.tab.scroller.directive'; +import { TAB_ROUTER_DIRECTIVES } from './mdc.tab.router.directive'; +import { TAB_DIRECTIVES } from './mdc.tab.directive'; +import { TAB_INDICATOR_DIRECTIVES } from './mdc.tab.indicator.directive'; + +import { Router, Routes } from '@angular/router'; + +const template = ` +
+
+ + +
+
+ +`; +const noHomeTemplate = ` +
+
+ +
+
+ +`; + +describe('MdcTabRouterDirective', () => { + @Component({ + template: `` + }) + class SearchComponent { + }; + + @Component({ + template: `
Search One
` + }) + class SearchOneComponent { + }; + + @Component({ + template: `
Search Two
` + }) + class SearchTwoComponent { + }; + + @Component({ + template: `
Home
` + }) + class HomeComponent { + } + + @Component({ + template: `
Other
` + }) + class OtherComponent { + } + + abstract class AbstractTestComponent { + } + + @Component({ + template: template + }) + class TestComponent extends AbstractTestComponent { + } + + @Component({ + template: noHomeTemplate + }) + class NoHomeTestComponent extends AbstractTestComponent { + } + + const testRoutes = [ + {path: '', redirectTo: 'home', pathMatch: 'full'}, + {path: 'home', component: HomeComponent}, + {path: 'search', component: SearchComponent, + children: [ + { path: 'one', component: SearchOneComponent }, + { path: 'two', component: SearchTwoComponent } + ], + }, + {path: 'other', component: OtherComponent} + ]; + + function setup(testComponentType: any = TestComponent, routes: Routes = testRoutes) { + const fixture = TestBed.configureTestingModule({ + imports: [RouterTestingModule.withRoutes(routes)], + declarations: [ + ...TAB_INDICATOR_DIRECTIVES, + ...TAB_DIRECTIVES, + ...TAB_ROUTER_DIRECTIVES, + ...TAB_SCROLLER_DIRECTIVES, + ...TAB_BAR_DIRECTIVES, + testComponentType, + ...routes.map(r => r.component).filter(c => !!c), + SearchOneComponent, SearchTwoComponent + ] + }).createComponent(testComponentType); + + let router = TestBed.inject(Router); + //let location = TestBed.inject(Location); + + fixture.ngZone.run(() => router.initialNavigation()); + fixture.detectChanges(); + tick(); + return { fixture, router }; //, location }; + } + + it('initial state and route navigation by interaction', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + // initial state has no tab selected, because no tab matches the home route: + expect(fixture.nativeElement.querySelector('#home')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('#search')).toBeNull(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([true, false]); + + // changing to search route: + tabs[1].click(); tick(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true]); + expect(fixture.nativeElement.querySelector('#home')).toBeNull(); + expect(fixture.nativeElement.querySelector('#search')).not.toBeNull(); + })); + + it('initial state when no route matches', fakeAsync(() => { + const { fixture } = setup(NoHomeTestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + // initial state has no tab selected, because no tab matches the home route: + expect(fixture.nativeElement.querySelector('#home')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('#search')).toBeNull(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false]); + + // after clicking search we should be on the search route, with tab-bar reflecting that: + tabs[0].click(); tick(); fixture.detectChanges(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([true]); + expect(fixture.nativeElement.querySelector('#home')).toBeNull(); + expect(fixture.nativeElement.querySelector('#search')).not.toBeNull(); + })); + + it('route change through router', fakeAsync(() => { + const { fixture, router } = setup(NoHomeTestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + // initial state has no tab selected, because no tab matches the home route: + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false]); + + fixture.ngZone.run(() =>router.navigate(['/home'])); + flush(); fixture.detectChanges(); + // still no tab selected, because 'home' doesn't match route for a tab: + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false]); + + fixture.ngZone.run(() =>router.navigate(['/search'])); + flush(); fixture.detectChanges(); + // search route and tab now active: + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([true]); + + fixture.ngZone.run(() =>router.navigate(['/home'])); + flush(); fixture.detectChanges(); + // search tab still selected, because we have no other tab to activate for '/home': + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([true]); + })); + + it('activate tab for child route', fakeAsync(() => { + const { fixture, router } = setup(TestComponent); + const tabs: HTMLElement[] = [...fixture.nativeElement.querySelectorAll('.mdc-tab')]; + + fixture.ngZone.run(() => router.navigate(['/search/two'])); + flush(); fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('#search')).not.toBeNull(); + expect(fixture.nativeElement.querySelector('#searchtwo')).not.toBeNull(); + expect(tabs.map(t => t.classList.contains('mdc-tab--active'))).toEqual([false, true]); + })); +}); diff --git a/bundle/src/components/tab/mdc.tab.router.directive.ts b/bundle/src/components/tab/mdc.tab.router.directive.ts new file mode 100644 index 0000000..bb68702 --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.router.directive.ts @@ -0,0 +1,62 @@ +import { ContentChildren, forwardRef, QueryList, Directive, ElementRef, Optional, Renderer2, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Router, RouterLink, RouterLinkWithHref } from '@angular/router'; +import { AbstractMdcTabDirective } from './mdc.tab.directive'; +import { RouterActiveDetector } from '../utility/router.active.detector'; +import { MdcEventRegistry } from '../../utils/mdc.event.registry'; + +/** + * Directive for a tab that triggers a route change. This directive must be used as a child of + * `mdcTabBar`. For a tab that doesn't use the angular routing module, drop the `routerLink` + * attribute. + * + * Selector `mdcTabRouter` is provided for backward compatibility and will be deprecated in the future. + * Use the selector `mdcTab` in combination with a `routerLink` attribute instead. + */ +@Directive({ + selector: '[mdcTab][routerLink],[mdcTabRouter]', + exportAs: 'mdcTab', + providers: [{provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabRouterDirective) }] +}) +export class MdcTabRouterDirective extends AbstractMdcTabDirective { + /** @internal */ + @ContentChildren(RouterLink, {descendants: true}) _links?: QueryList; + /** @internal */ + @ContentChildren(RouterLinkWithHref, {descendants: true}) _linksWithHrefs?: QueryList; + private routerActive: RouterActiveDetector | null = null; + + constructor(rndr: Renderer2, root: ElementRef, registry: MdcEventRegistry, private router: Router, + @Inject(DOCUMENT) doc: any, + @Optional() private link?: RouterLink, @Optional() private linkWithHref?: RouterLinkWithHref) { + super(rndr, root, registry, doc as Document); + } + + ngOnDestroy() { + this.routerActive?.destroy(); + this.routerActive = null; + super.ngOnDestroy(); + } + + ngAfterContentInit(): void { + super.ngAfterContentInit(); + this.routerActive = new RouterActiveDetector(this, this._links!, this._linksWithHrefs!, this.router, + this.link, this.linkWithHref); + this.routerActive.init(); + } + + ngOnChanges(): void { + this.routerActive?.update(); + } + + /** @internal */ + isRouterActive() { + return this.isActive(); + } + + /** @internal */ + setRouterActive(activate: boolean) { + this.triggerActivation(activate); + } +} + +export const TAB_ROUTER_DIRECTIVES = [MdcTabRouterDirective]; diff --git a/bundle/src/components/tab/mdc.tab.scroller.directive.spec.ts b/bundle/src/components/tab/mdc.tab.scroller.directive.spec.ts new file mode 100644 index 0000000..7561290 --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.scroller.directive.spec.ts @@ -0,0 +1,59 @@ +import { TestBed, fakeAsync } from '@angular/core/testing'; +import { Component } from '@angular/core'; +import { TAB_SCROLLER_DIRECTIVES } from './mdc.tab.scroller.directive'; +import { TAB_DIRECTIVES } from './mdc.tab.directive'; +import { TAB_INDICATOR_DIRECTIVES } from './mdc.tab.indicator.directive'; + +const template = ` +
+
+
+ +
+
+
+`; + +describe('MdcTabScrollerDirective', () => { + abstract class AbstractTestComponent { + tabs = [ + {icon: 'access_time', label: 'recents'}, + {icon: 'near_me', label: 'nearby'}, + {icon: 'favorite', label: 'favorites'} + ]; + } + + @Component({ + template: template + }) + class TestComponent extends AbstractTestComponent { + } + + function setup(testComponentType: any = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [...TAB_INDICATOR_DIRECTIVES, ...TAB_DIRECTIVES, ...TAB_SCROLLER_DIRECTIVES, testComponentType] + }).createComponent(testComponentType); + fixture.detectChanges(); + return { fixture }; + } + + it('should initialize with defaults', fakeAsync(() => { + const { fixture } = setup(TestComponent); + const scroller: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-scroller'); + const area: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-scroller__scroll-area'); + const content: HTMLElement = fixture.nativeElement.querySelector('.mdc-tab-scroller__scroll-content'); + + expect(scroller.classList).toBeDefined(); + expect(area.classList).toBeDefined(); + expect(content.classList).toBeDefined(); + })); +}); + diff --git a/bundle/src/components/tab/mdc.tab.scroller.directive.ts b/bundle/src/components/tab/mdc.tab.scroller.directive.ts new file mode 100644 index 0000000..d07101a --- /dev/null +++ b/bundle/src/components/tab/mdc.tab.scroller.directive.ts @@ -0,0 +1,142 @@ +import { AfterContentInit, ContentChildren, Directive, ElementRef, + HostBinding, OnDestroy, Renderer2, QueryList, Inject } from '@angular/core'; +import { MDCTabScrollerFoundation, MDCTabScrollerAdapter, util } from '@material/tab-scroller'; +import { events, ponyfill } from '@material/dom'; +import { MdcEventRegistry } from '../../utils/mdc.event.registry'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { DOCUMENT } from '@angular/common'; +import { AbstractMdcTabDirective } from './mdc.tab.directive'; + +/** + * Directive for a the scroll content of an `mdcTabScrollerArea`. This directive must wrap the + * `mdcTab` directives for each of the tabs. + */ +@Directive({ + selector: '[mdcTabScrollerContent]' +}) +export class MdcTabScrollerContentDirective { + /** @internal */ + @HostBinding('class.mdc-tab-scroller__scroll-content') readonly _cls = true; + + constructor(public _el: ElementRef) {} +} + +/** + * Directive for a the scroll area of an `mdcTabScroller`. This directive should have exactly one + * `mdcTabScrollerContent` child directive. + */ +@Directive({ + selector: '[mdcTabScrollerArea]' +}) +export class MdcTabScrollerAreaDirective { + /** @internal */ + @HostBinding('class.mdc-tab-scroller__scroll-area') readonly _cls = true; + + constructor(public _el: ElementRef) {} +} + +/** + * Directive for a scrollable tab bar. This directive should have exactly one + * `mdcTabScrollerArea` child directive. + */ +@Directive({ + selector: '[mdcTabScroller]' +}) +export class MdcTabScrollerDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-tab-scroller') readonly _cls = true; + private onDestroy$: Subject = new Subject(); + /** @internal */ + @ContentChildren(MdcTabScrollerAreaDirective) _areas?: QueryList; + /** @internal */ + @ContentChildren(MdcTabScrollerContentDirective, {descendants: true}) _contents?: QueryList; + /** @internal */ + @ContentChildren(AbstractMdcTabDirective, {descendants: true}) _tabs?: QueryList; + private document: Document; + private _adapter: MDCTabScrollerAdapter = { + eventTargetMatchesSelector: (target, selector) => ponyfill.matches(target as Element, selector), + addClass: (name) => this._rndr.addClass(this._el.nativeElement, name), + removeClass: (name) => this._rndr.removeClass(this._el.nativeElement, name), + addScrollAreaClass: (name) => this._rndr.addClass(this._area!._el.nativeElement, name), + setScrollAreaStyleProperty: (name, value) => this._rndr.setStyle(this._area!._el.nativeElement, name, value), + setScrollContentStyleProperty: (name, value) => this._rndr.setStyle(this._content!._el.nativeElement, name, value), + getScrollContentStyleValue: (name) => getComputedStyle(this._content!._el.nativeElement).getPropertyValue(name), + setScrollAreaScrollLeft: (scrollX) => this._area!._el.nativeElement.scrollLeft = scrollX, + getScrollAreaScrollLeft: () => this._area!._el.nativeElement.scrollLeft, + getScrollContentOffsetWidth: () => this._content!._el.nativeElement.offsetWidth, + getScrollAreaOffsetWidth: () => this._area!._el.nativeElement.offsetWidth, + computeScrollAreaClientRect: () => this._area!._el.nativeElement.getBoundingClientRect(), + computeScrollContentClientRect: () => this._content!._el.nativeElement.getBoundingClientRect(), + computeHorizontalScrollbarHeight: () => util.computeHorizontalScrollbarHeight(this.document) + }; + /** @internal */ + _foundation: MDCTabScrollerFoundation | null = null; + + constructor(private _rndr: Renderer2, private _el: ElementRef, private registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; // work around ngc issue https://github.com/angular/angular/issues/20351 + } + + ngAfterContentInit() { + let initializer = () => { + this.destroyFoundation(); + if (this._content && this._area) + this.initFoundation(); + }; + initializer(); + this._contents!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); + this._areas!.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer); + } + + ngOnDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); + this.destroyFoundation(); + } + + private initFoundation() { + this._foundation = new MDCTabScrollerFoundation(this._adapter); + this._foundation.init(); + // manual registration of event listeners, because we need applyPassive, which is not (yet) + // supported by angular bindings: + this.registry.listen(this._rndr, 'wheel', this._handleInteraction, this._area!._el, events.applyPassive()); + this.registry.listen(this._rndr, 'touchstart', this._handleInteraction, this._area!._el, events.applyPassive()); + this.registry.listen(this._rndr, 'pointerdown', this._handleInteraction, this._area!._el, events.applyPassive()); + this.registry.listen(this._rndr, 'mousedown', this._handleInteraction, this._area!._el, events.applyPassive()); + this.registry.listen(this._rndr, 'keydown', this._handleInteraction, this._area!._el, events.applyPassive()); + this.registry.listen(this._rndr, 'transitionend', this._handleTransitionEnd, this._content!._el); + } + + private destroyFoundation() { + let destroy = this._foundation != null; + if (destroy) { + this.registry.unlisten('wheel', this._handleInteraction); + this.registry.unlisten('touchstart', this._handleInteraction); + this.registry.unlisten('pointerdown', this._handleInteraction); + this.registry.unlisten('mousedown', this._handleInteraction); + this.registry.unlisten('keydown', this._handleInteraction); + this.registry.unlisten('transitionend', this._handleTransitionEnd); + this._foundation!.destroy(); + } + this._foundation = null; + return destroy; + } + + private _handleInteraction = () => this._foundation!.handleInteraction(); + private _handleTransitionEnd = (evt: Event) => this._foundation!.handleTransitionEnd(evt); + + /** @internal */ + _getScrollContentWidth() { + return this._adapter.getScrollContentOffsetWidth(); + } + + private get _area() { + return this._areas && this._areas.length > 0 ? this._areas.first : null; + } + + private get _content() { + return this._contents && this._contents.length > 0 ? this._contents.first : null; + } +} + +export const TAB_SCROLLER_DIRECTIVES = [MdcTabScrollerContentDirective, MdcTabScrollerAreaDirective, MdcTabScrollerDirective]; diff --git a/bundle/src/components/tabs/mdc.tab.adapter.ts b/bundle/src/components/tabs/mdc.tab.adapter.ts deleted file mode 100644 index 64937aa..0000000 --- a/bundle/src/components/tabs/mdc.tab.adapter.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** @docs-private */ -export interface MdcTabAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - registerInteractionHandler: (evt: string, handler: EventListener) => void; - deregisterInteractionHandler: (evt: string, handler: EventListener) => void; - getOffsetWidth: () => number; - getOffsetLeft: () => number; - notifySelected: () => void; -} diff --git a/bundle/src/components/tabs/mdc.tab.bar.adapter.ts b/bundle/src/components/tabs/mdc.tab.bar.adapter.ts deleted file mode 100644 index 02b0be2..0000000 --- a/bundle/src/components/tabs/mdc.tab.bar.adapter.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { MDCTab } from '@material/tabs'; - -/** @docs-private */ -export interface MdcTabBarAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - bindOnMDCTabSelectedEvent: () => void; - unbindOnMDCTabSelectedEvent: () => void; - registerResizeHandler: (handler: EventListener) => void; - deregisterResizeHandler: (handler: EventListener) => void; - getOffsetWidth: () => number; - setStyleForIndicator: (propertyName: string, value: string) => void; - getOffsetWidthForIndicator: () => number; - notifyChange: (evtData: {activeTabIndex: number}) => void; - getNumberOfTabs: () => number; - isTabActiveAtIndex: (index: number) => boolean; - setTabActiveAtIndex: (index: number, isActive: boolean) => void; - isDefaultPreventedOnClickForTabAtIndex: (index: number) => boolean; - setPreventDefaultOnClickForTabAtIndex: (index: number, preventDefaultOnClick: boolean) => void; - measureTabAtIndex: (index: number) => void; - getComputedWidthForTabAtIndex: (index: number) => number; - getComputedLeftForTabAtIndex: (index: number) => number; -} diff --git a/bundle/src/components/tabs/mdc.tab.bar.directive.ts b/bundle/src/components/tabs/mdc.tab.bar.directive.ts deleted file mode 100644 index da2f662..0000000 --- a/bundle/src/components/tabs/mdc.tab.bar.directive.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { ContentChildren, EventEmitter, QueryList, Directive, ElementRef, HostBinding, Output, Renderer2 } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { MDCTabBarFoundation } from '@material/tabs'; -import { MdcTabBarAdapter } from './mdc.tab.bar.adapter'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -import { AbstractMdcTabDirective, MdcTabChange } from './mdc.tab.directive'; - -const CLASS_TAB_BAR = 'mdc-tab-bar'; -const CLASS_INDICATOR = 'mdc-tab-bar__indicator'; -const CLASS_ICONS_BAR = 'mdc-tab-bar--icon-tab-bar'; -const CLASS_ICONS_WITH_TEXT_BAR = 'mdc-tab-bar--icons-with-text'; - -/** - * Directive for a tab bar. This directive must have mdcTab, - * or mdcTabRouter children. The tab bar can optionally be - * embedded inside an mdcTabBarScroller. - */ -@Directive({ - selector: '[mdcTabBar]' -}) -export class MdcTabBarDirective { - @HostBinding('class.' + CLASS_TAB_BAR) _hostClass = true; - @HostBinding('class.mdc-tab-bar-scroller__scroll-frame__tabs') _insideScrollFrame = false; - @ContentChildren(AbstractMdcTabDirective, {descendants: false}) _tabs: QueryList; - /** - * Event emitted when the actived tab changes. - */ - @Output() tabChange: EventEmitter = new EventEmitter(); - private _indicator: HTMLElement; - private _adapter: MdcTabBarAdapter = { - addClass: (className: string) => this._rndr.addClass(this._el.nativeElement, className), - removeClass: (className: string) => this._rndr.removeClass(this._el.nativeElement, className), - bindOnMDCTabSelectedEvent: () => this._listenTabSelected(), - unbindOnMDCTabSelectedEvent: () => this._unlistenTabSelected(), - registerResizeHandler: (handler: EventListener) => window.addEventListener('resize', handler), - deregisterResizeHandler: (handler: EventListener) => window.removeEventListener('resize', handler), - getOffsetWidth: () => this._el.nativeElement.offsetWidth, - setStyleForIndicator: (propertyName: string, value: string) => this._rndr.setStyle(this._indicator, propertyName, value), - getOffsetWidthForIndicator: () => this._indicator.offsetWidth, - notifyChange: (evtData: {activeTabIndex: number}) => { - this.tabChange.emit({tab: null, tabIndex: evtData.activeTabIndex}); - }, - getNumberOfTabs: () => this._tabs.length, - isTabActiveAtIndex: (index: number) => index >= 0 ? this._tabs.toArray()[index]._active : false, - setTabActiveAtIndex: (index: number, isActive = true) => this._tabs.toArray()[index]._active = isActive, - isDefaultPreventedOnClickForTabAtIndex: (index: number) => !!this._tabs.toArray()[index]._foundation.preventsDefaultOnClick, - setPreventDefaultOnClickForTabAtIndex: (index: number, preventDefaultOnClick: boolean) => this._tabs.toArray()[index]._foundation.setPreventDefaultOnClick(preventDefaultOnClick), - measureTabAtIndex: (index: number) => this._tabs.toArray()[index]._foundation.measureSelf(), - getComputedWidthForTabAtIndex: (index: number) => this._tabs.toArray()[index]._foundation.getComputedWidth(), - getComputedLeftForTabAtIndex: (index: number) => this._tabs.toArray()[index]._foundation.getComputedLeft() - }; - private _subscriptions: Subscription[]; - private _foundation = new MDCTabBarFoundation(this._adapter); - - constructor(private _rndr: Renderer2, public _el: ElementRef, private registry: MdcEventRegistry) { - } - - ngAfterContentInit() { - this._tabs.changes.subscribe(() => { - if (this._subscriptions) - // make sure we update the tab change event subscriptions: - this._listenTabSelected(); - }); - this.addIndicator(); - this._foundation.init(); - } - - ngOnDestroy() { - this._foundation.destroy(); - } - - private addIndicator() { - this._indicator = this._rndr.createElement('span'); - this._rndr.addClass(this._indicator, CLASS_INDICATOR); - this._rndr.appendChild(this._el.nativeElement, this._indicator); - } - - private _listenTabSelected() { - if (this._subscriptions) - this._unlistenTabSelected(); - this._subscriptions = new Array(); - this._tabs.forEach(tab => { - this._subscriptions.push(tab.activate.subscribe(event => { - this._setActive(event.tab, true); - })); - }); - } - - private _unlistenTabSelected() { - this._subscriptions.forEach(sub => sub.unsubscribe()); - this._subscriptions = null; - } - - private _setActive(tab: AbstractMdcTabDirective, notifyChange: boolean) { - const index = this._tabs.toArray().indexOf(tab); - this._foundation.switchToTabAtIndex(index, notifyChange); - } - - @HostBinding('class.' + CLASS_ICONS_BAR) - get _tabBarWithIcon() { - return this._tabs.length > 0 - && this._tabs.first._mdcTabIcon != null - && this._tabs.first._mdcTabIconText == null; - } - - @HostBinding('class.' + CLASS_ICONS_WITH_TEXT_BAR) - get _tabBarWithIconAndText() { - return this._tabs.length > 0 - && this._tabs.first._mdcTabIcon != null - && this._tabs.first._mdcTabIconText != null; - } -} diff --git a/bundle/src/components/tabs/mdc.tab.bar.scroller.adapter.ts b/bundle/src/components/tabs/mdc.tab.bar.scroller.adapter.ts deleted file mode 100644 index a7480f9..0000000 --- a/bundle/src/components/tabs/mdc.tab.bar.scroller.adapter.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** @docs-private */ -export interface MdcTabBarScrollerAdapter { - addClass: (className: string) => void; - removeClass: (className: string) => void; - eventTargetHasClass: (target: HTMLElement, className: string) => boolean; - addClassToForwardIndicator: (className: string) => void; - removeClassFromForwardIndicator: (className: string) => void; - addClassToBackIndicator: (className: string) => void; - removeClassFromBackIndicator: (className: string) => void; - isRTL: () => boolean; - registerBackIndicatorClickHandler: (handler: EventListener) => void; - deregisterBackIndicatorClickHandler: (handler: EventListener) => void; - registerForwardIndicatorClickHandler: (handler: EventListener) => void; - deregisterForwardIndicatorClickHandler: (handler: EventListener) => void; - registerCapturedInteractionHandler: (evt: string, handler: EventListener) => void; - deregisterCapturedInteractionHandler: (evt: string, handler: EventListener) => void; - registerWindowResizeHandler: (handler: EventListener) => void; - deregisterWindowResizeHandler: (handler: EventListener) => void; - getNumberOfTabs: () => number; - getComputedWidthForTabAtIndex: (index: number) => number; - getComputedLeftForTabAtIndex: (index: number) => number; - getOffsetWidthForScrollFrame: () => number; - getScrollLeftForScrollFrame: () => number; - setScrollLeftForScrollFrame: (scrollLeftAmount: number) => void; - getOffsetWidthForTabBar: () => number; - setTransformStyleForTabBar: (value: string) => void; - getOffsetLeftForEventTarget: (target: HTMLElement) => number; - getOffsetWidthForEventTarget: (target: HTMLElement) => number; -} diff --git a/bundle/src/components/tabs/mdc.tab.bar.scroller.directive.ts b/bundle/src/components/tabs/mdc.tab.bar.scroller.directive.ts deleted file mode 100644 index f3fab1c..0000000 --- a/bundle/src/components/tabs/mdc.tab.bar.scroller.directive.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { AfterContentInit, ContentChild, ContentChildren, forwardRef, Directive, ElementRef, - HostBinding, HostListener, Input, OnDestroy, Optional, Output, Renderer2, Self } from '@angular/core'; -import { getCorrectPropertyName } from '@material/animation'; -import { MDCTabBarScrollerFoundation } from '@material/tabs'; -import { AbstractMdcTabDirective } from './mdc.tab.directive'; -import { MdcTabBarScrollerAdapter } from './mdc.tab.bar.scroller.adapter'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; -import { MdcTabBarDirective } from './mdc.tab.bar.directive'; - -const CLASS_SCROLLER = 'mdc-tab-bar-scroller'; -const CLASS_INDICATOR = 'mdc-tab-bar-scroller__indicator'; -const CLASS_INDICATOR_INNER = 'mdc-tab-bar-scroller__indicator__inner'; -const CLASS_INDICATOR_BACK = 'mdc-tab-bar-scroller__indicator--back'; -const CLASS_INDICATOR_FORWARD = 'mdc-tab-bar-scroller__indicator--forward'; -const CLASS_SCROLLER_FRAME = 'mdc-tab-bar-scroller__scroll-frame'; - -/** - * Directive for the icon of the back or forward button of a tab bar scroller. - * Use this directive on a child element of mdcTabBarScrollerBack, - * and mdcTabBarScrollerForward. - */ -@Directive({ - selector: '[mdcTabBarScrollerInner]' -}) -export class MdcTabBarScrollerInnerDirective { - @HostBinding('class.' + CLASS_INDICATOR_INNER) _hostClass = true; -} - -/** - * Directive for the 'back' button of a tab bar scroller. Must be the - * first child of an mdcTabBarScroller. - * Embed an mdcTabBarScrollerInner inside this directive for the - * actual icon. - */ -@Directive({ - selector: '[mdcTabBarScrollerBack]' -}) -export class MdcTabBarScrollerBackDirective { - @HostBinding('class.' + CLASS_INDICATOR) _hostClass = true; - @HostBinding('class.' + CLASS_INDICATOR_BACK) _back = true; - - constructor(public _el: ElementRef) { - } -} - -/** - * Directive for the 'forward' button of a tab bar scroller. Must be the - * last child of an mdcTabBarScroller. - * Embed an mdcTabBarScrollerInner inside this directive for the - * actual icon. - */ -@Directive({ - selector: '[mdcTabBarScrollerForward]' -}) -export class MdcTabBarScrollerForwardDirective { - @HostBinding('class.' + CLASS_INDICATOR) _hostClass = true; - @HostBinding('class.' + CLASS_INDICATOR_FORWARD) _forward = true; - - constructor(public _el: ElementRef) { - } -} - -/** - * Directive for the 'frame' part (containing the tab bar) of a tab bar scroller. - * Must be the child of an mdcTabBarScroller, and have an - * mdcTabBar as child. - */ -@Directive({ - selector: '[mdcTabBarScrollerFrame]' -}) -export class MdcTabBarScrollerFrameDirective implements AfterContentInit { - @HostBinding('class.' + CLASS_SCROLLER_FRAME) _hostClass = true; - @ContentChild(MdcTabBarDirective) _tabBar: MdcTabBarDirective; - - constructor(public _el: ElementRef) { - } - - ngAfterContentInit() { - if (this._tabBar) - this._tabBar._insideScrollFrame = true; - } - - _tabAt(index: number) { - if (this._tabBar) { - let tabs = this._tabBar._tabs.toArray(); - if (index >= 0 && index < tabs.length) - return tabs[index]; - } - return null; - } -} - -/** - * Directive for a scrollable tab bar. Add mdcTabBarScrollerBack, - * mdcTabBarScrollerFrame, and mdcTabBarScrollerForward - * as children for respectively the back button, scrollable tab bar, and forward button. - */ -@Directive({ - selector: '[mdcTabBarScroller]' -}) -export class MdcTabBarScrollerDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.' + CLASS_SCROLLER) _hostClass = true; - @ContentChild(MdcTabBarScrollerBackDirective) _back: MdcTabBarScrollerBackDirective; - @ContentChild(MdcTabBarScrollerForwardDirective) _forward: MdcTabBarScrollerForwardDirective; - @ContentChild(MdcTabBarScrollerFrameDirective) _scrollFrame: MdcTabBarScrollerFrameDirective; - private _adapter: MdcTabBarScrollerAdapter = { - addClass: (className: string) => this._rndr.addClass(this._el.nativeElement, className), - removeClass: (className: string) => this._rndr.removeClass(this._el.nativeElement, className), - eventTargetHasClass: (target: HTMLElement, className: string) => target.classList.contains(className), - addClassToForwardIndicator: (className: string) => { - if (this._forward) - this._rndr.addClass(this._forward._el.nativeElement, className); - }, - removeClassFromForwardIndicator: (className: string) => { - if (this._forward) - this._rndr.removeClass(this._forward._el.nativeElement, className); - }, - addClassToBackIndicator: (className: string) => { - if (this._back) - this._rndr.addClass(this._back._el.nativeElement, className); - }, - removeClassFromBackIndicator: (className: string) => { - if (this._back) - this._rndr.removeClass(this._back._el.nativeElement, className); - }, - isRTL: () => getComputedStyle(this._el.nativeElement).getPropertyValue('direction') === 'rtl', - registerBackIndicatorClickHandler: (handler: EventListener) => { - if (this._back) - this.registry.listen(this._rndr, 'click', handler, this._back._el); - }, - deregisterBackIndicatorClickHandler: (handler: EventListener) => { - if (this._back) - this.registry.unlisten('click', handler); - }, - registerForwardIndicatorClickHandler: (handler: EventListener) => { - if (this._forward) - this.registry.listen(this._rndr, 'click', handler, this._forward._el); - }, - deregisterForwardIndicatorClickHandler: (handler: EventListener) => { - if (this._forward) - this.registry.unlisten('click', handler); - }, - registerCapturedInteractionHandler: (evt: string, handler: EventListener) => { - this.registry.listen(this._rndr, evt, handler, this._el); - }, - deregisterCapturedInteractionHandler: (evt: string, handler: EventListener) => { - this.registry.unlisten(evt, handler); - }, - registerWindowResizeHandler: (handler: EventListener) => window.addEventListener('resize', handler), - deregisterWindowResizeHandler: (handler: EventListener) => window.removeEventListener('resize', handler), - getNumberOfTabs: () => { - if (this._scrollFrame && this._scrollFrame._tabBar) - return this._scrollFrame._tabBar._tabs.length; - return 0; - }, - getComputedWidthForTabAtIndex: (index: number) => this._tabAt(index)._foundation.getComputedWidth(), - getComputedLeftForTabAtIndex: (index: number) => this._tabAt(index)._foundation.getComputedLeft(), - getOffsetWidthForScrollFrame: () => { - if (this._scrollFrame) - return this._scrollFrame._el.nativeElement.offsetWidth; - return 0; - }, - getScrollLeftForScrollFrame: () => { - if (this._scrollFrame) - return this._scrollFrame._el.nativeElement.scrollLeft; - return 0; - }, - setScrollLeftForScrollFrame: (scrollLeftAmount: number) => { - if (this._scrollFrame) - this._rndr.setProperty(this._scrollFrame._el.nativeElement, 'scrollLeft', scrollLeftAmount); - }, - getOffsetWidthForTabBar: () => { - if (this._scrollFrame && this._scrollFrame._tabBar) - return this._scrollFrame._tabBar._el.nativeElement.offsetWidth; - return 0; - }, - setTransformStyleForTabBar: (value: string) => { - if (this._scrollFrame && this._scrollFrame._tabBar) - this._rndr.setStyle(this._scrollFrame._tabBar._el.nativeElement, getCorrectPropertyName(window, 'transform'), value); - }, - getOffsetLeftForEventTarget: (target: HTMLElement) => target.offsetLeft, - getOffsetWidthForEventTarget: (target: HTMLElement) => target.offsetWidth - } - private _foundation = new MDCTabBarScrollerFoundation(this._adapter); - - constructor(private _rndr: Renderer2, private _el: ElementRef, private registry: MdcEventRegistry) { - } - - ngAfterContentInit() { - this._foundation.init(); - } - - ngOnDestroy() { - this._foundation.destroy(); - } - - private _tabAt(index: number) { - if (this._scrollFrame) - return this._scrollFrame._tabAt(index); - return null; - } -} diff --git a/bundle/src/components/tabs/mdc.tab.directive.ts b/bundle/src/components/tabs/mdc.tab.directive.ts deleted file mode 100644 index ea3d811..0000000 --- a/bundle/src/components/tabs/mdc.tab.directive.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { AfterContentInit, ContentChild, ContentChildren, EventEmitter, forwardRef, Directive, ElementRef, - HostBinding, HostListener, Input, OnDestroy, Optional, Output, Renderer2, Self } from '@angular/core'; -import { NgControl } from '@angular/forms'; -import { MDCTabFoundation } from '@material/tabs'; -import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { MdcTabAdapter } from './mdc.tab.adapter'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -/** - * The interface for events send by the activate output of an - * mdcTab or mdcTabRouter directive, or by - * the tabChange event of an mdcTabBar. - */ -export interface MdcTabChange { - /** - * A reference to the tab that sends the event. - */ - tab: AbstractMdcTabDirective, - /** - * The index of the tab that sends the event. - */ - tabIndex: number -} - -/** - * Directive for an icon when having a tab bar with icons. - * This directive must be used as a child of an mdcTab, - * or mdcTabRouter. - */ -@Directive({ - selector: '[mdcTabIcon]' -}) -export class MdcTabIconDirective { - @HostBinding('class.mdc-tab__icon') _hostClass = true; -} - -/** - * Directive for the text of tabs, when having a tab bar with icons and text labels. - * This directive must be used as a child of an mdcTab, and as a sibbling - * to a preceding mdcTabIcon. - */ -@Directive({ - selector: '[mdcTabIconText]' -}) -export class MdcTabIconTextDirective { - @HostBinding('class.mdc-tab__icon-text') _hostClass = true; -} - -export class AbstractMdcTabDirective extends AbstractMdcRipple implements OnDestroy, AfterContentInit { - @HostBinding('class.mdc-tab') _hostClass = true; - @ContentChild(MdcTabIconDirective) _mdcTabIcon: MdcTabIconDirective; - @ContentChild(MdcTabIconTextDirective) _mdcTabIconText: MdcTabIconTextDirective; - /** - * Event called when the tab is activated. - */ - @Output() activate: EventEmitter = new EventEmitter(); - protected _adapter: MdcTabAdapter = { - addClass: (className: string) => this._rndr.addClass(this._root.nativeElement, className), - removeClass: (className: string) => this._rndr.removeClass(this._root.nativeElement, className), - registerInteractionHandler: (type: string, handler: EventListener) => this._registry.listen(this._rndr, type, handler, this._root), - deregisterInteractionHandler: (type: string, handler: EventListener) => this._registry.unlisten(type, handler), - getOffsetWidth: () => this._root.nativeElement.offsetWidth, - getOffsetLeft: () => this._root.nativeElement.offsetLeft, - notifySelected: () => this.activate.emit({tab: this, tabIndex: null}) - }; - _foundation = new MDCTabFoundation(this._adapter); - - constructor(protected _rndr: Renderer2, protected _root: ElementRef, protected _registry: MdcEventRegistry) { - super(_root, _rndr, _registry); - } - - ngAfterContentInit() { - this.initRipple(); - this._foundation.init(); - } - - ngOnDestroy() { - this.destroyRipple(); - this._foundation.destroy(); - } - - @HostBinding('class.mdc-tab--with-icon-and-text') - get _tabWithIconAndText() { - return this._mdcTabIcon != null && this._mdcTabIconText != null; - } - - @HostBinding('class.mdc-tab--active') - get _active() { - return this._foundation.isActive(); - } - - set _active(value: boolean) { - this._foundation.setActive(value); - } -} - -/** - * Directive for a tab. This directive must be used as a child of mdcTabBar. - */ -@Directive({ - selector: '[mdcTab]', - providers: [{provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabDirective) }] -}) -export class MdcTabDirective extends AbstractMdcTabDirective { - constructor(rndr: Renderer2, root: ElementRef, registry: MdcEventRegistry) { - super(rndr, root, registry); - } - - /** - * Input for activating the tab. Assign a value other than false to activate - * the tab. Any other value will have no effect: in order to deatcivate the tab, you must - * activate another tab. - */ - @Input() - get active() { - return this._active; - } - - set active(value: boolean) { - let activate = asBoolean(value); - if (activate) { - this._active = true; - this._adapter.notifySelected(); - } - } -} diff --git a/bundle/src/components/tabs/mdc.tab.router.directive.ts b/bundle/src/components/tabs/mdc.tab.router.directive.ts deleted file mode 100644 index 383ba09..0000000 --- a/bundle/src/components/tabs/mdc.tab.router.directive.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ContentChildren, forwardRef, QueryList, Directive, ElementRef, Optional, Renderer2 } from '@angular/core'; -import { Router, RouterLink, RouterLinkWithHref } from '@angular/router'; -import { AbstractMdcTabDirective } from './mdc.tab.directive'; -import { RouterActiveDetector } from '../utility/router.active.detector'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -@Directive({ - selector: '[mdcTabRouter]', - exportAs: 'mdcTabRouter', - providers: [{provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabRouterDirective) }] -}) -export class MdcTabRouterDirective extends AbstractMdcTabDirective { - @ContentChildren(RouterLink, {descendants: true}) _links: QueryList; - @ContentChildren(RouterLinkWithHref, {descendants: true}) _linksWithHrefs: QueryList; - private routerActive: RouterActiveDetector; - - constructor(rndr: Renderer2, root: ElementRef, registry: MdcEventRegistry, private router: Router, - @Optional() private link?: RouterLink, @Optional() private linkWithHref?: RouterLinkWithHref) { - super(rndr, root, registry); - } - - ngOnDestroy() { - this.routerActive.destroy(); - this.routerActive = null; - super.ngOnDestroy(); - } - - ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.routerActive = new RouterActiveDetector(this, this._links, this._linksWithHrefs, this.router, - this.link, this.linkWithHref); - this.routerActive.init(); - } - - ngOnChanges(): void { - if (this.routerActive) - this.routerActive.update(); - } - - /** @docs-private */ - isRouterActive() { - return this._active; - } - - /** @docs-private */ - setRouterActive(active: boolean) { - this._active = active; - if (active) - this._adapter.notifySelected(); - } -} diff --git a/bundle/src/components/text-field/mdc.text-field.adapter.ts b/bundle/src/components/text-field/mdc.text-field.adapter.ts deleted file mode 100644 index 33dbeb7..0000000 --- a/bundle/src/components/text-field/mdc.text-field.adapter.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { MDCTextFieldHelperTextFoundation } from '@material/textfield/helper-text'; - -/** @docs-private */ -export interface MdcTextFieldHelperTextAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - hasClass: (className: string) => void, - setAttr: (name: string, value: string) => void, - removeAttr: (name: string) => void, - setContent: (content: string) => void -} - -/** @docs-private */ -export interface MdcTextFieldIconAdapter { - getAttr: (attr: string) => string, - setAttr: (name: string, value: string) => void, - removeAttr: (name: string) => void, - setContent: (content: string) => void, - registerInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterInteractionHandler: (evtType: string, handler: EventListener) => void, - notifyIconAction: () => void -} - -/** @docs-private */ -export interface MdcTextFieldAdapter { - addClass: (className: string) => void, - removeClass: (className: string) => void, - hasClass: (className: string) => boolean, - registerTextFieldInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterTextFieldInteractionHandler: (evtType: string, handler: EventListener) => void, - registerInputInteractionHandler: (evtType: string, handler: EventListener) => void, - deregisterInputInteractionHandler: (evtType: string, handler: EventListener) => void, - registerValidationAttributeChangeHandler: (handler: (arg: Array) => void) => MutationObserver, - deregisterValidationAttributeChangeHandler: (observer: MutationObserver) => void, - getNativeInput: () => {value: string, disabled: boolean, validity: {badInput: boolean, valid: boolean}}, - isFocused: () => boolean, - isRtl: () => boolean, - activateLineRipple: () => void, - deactivateLineRipple: () => void, - setLineRippleTransformOrigin: (normalizedX: number) => void - shakeLabel: (shouldShake: boolean) => void, - floatLabel: (shouldFloat: boolean) => void, - hasLabel: () => boolean, - getLabelWidth: () => number, - hasOutline: () => boolean, - notchOutline: (labelWidth: number, isRtl: boolean) => void, - closeOutline: () => void -} diff --git a/bundle/src/components/text-field/mdc.text-field.directive.spec.ts b/bundle/src/components/text-field/mdc.text-field.directive.spec.ts new file mode 100644 index 0000000..ddde9e2 --- /dev/null +++ b/bundle/src/components/text-field/mdc.text-field.directive.spec.ts @@ -0,0 +1,477 @@ +import { TestBed, fakeAsync, ComponentFixture, tick, flush } from '@angular/core/testing'; +import { Component, Type } from '@angular/core'; +import { MdcFloatingLabelDirective } from '../floating-label/mdc.floating-label.directive'; +import { MdcNotchedOutlineDirective, MdcNotchedOutlineNotchDirective } from '../notched-outline/mdc.notched-outline.directive'; +import { MdcTextFieldDirective, MdcTextFieldInputDirective, MdcTextFieldIconDirective, + MdcTextFieldHelperLineDirective, MdcTextFieldHelperTextDirective } from './mdc.text-field.directive'; +import { hasRipple } from '../../testutils/page.test'; +import { By } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; + +describe('MdcTextFieldDirective', () => { + it('filled: should render the text-field with ripple and label', fakeAsync(() => { + const { fixture } = setup(); + const root = fixture.nativeElement.querySelector('.mdc-text-field'); + expect(root.children.length).toBe(4); + expect(root.children[0].classList).toContain('mdc-text-field__ripple'); + expect(root.children[1].classList).toContain('mdc-text-field__input'); + expect(root.children[2].classList).toContain('mdc-floating-label'); + expect(root.children[3].classList).toContain('mdc-line-ripple'); + expect(hasRipple(root)).toBe(true, 'the ripple element should be attached'); + + // input must be labelled by the floating label: + expect(root.children[2].id).toMatch(/mdc-u-id-.*/); + expect(root.children[1].getAttribute('aria-labelledby')).toBe(root.children[2].id); + })); + + it('filled: floating label must float when input has focus', fakeAsync(() => { + const { fixture, element } = setup(); + const floatingLabelElm = fixture.nativeElement.querySelector('.mdc-floating-label'); + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); + element.dispatchEvent(new Event('focus')); tick(); + expect(floatingLabelElm.classList).toContain('mdc-floating-label--float-above'); + element.dispatchEvent(new Event('blur')); tick(); + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); + })); + + it('outlined: should render the text-field with outline and label', fakeAsync(() => { + const { fixture, testComponent } = setup(); + testComponent.outlined = true; + fixture.detectChanges(); tick(5); fixture.detectChanges(); + const root = fixture.nativeElement.querySelector('.mdc-text-field'); + expect(root.children.length).toBe(2); + expect(root.children[0].classList).toContain('mdc-text-field__input'); + expect(root.children[1].classList).toContain('mdc-notched-outline'); + const notchedOutline = root.children[1]; + expect(notchedOutline.children.length).toBe(3); + expect(notchedOutline.children[0].classList).toContain('mdc-notched-outline__leading'); + expect(notchedOutline.children[1].classList).toContain('mdc-notched-outline__notch'); + expect(notchedOutline.children[2].classList).toContain('mdc-notched-outline__trailing'); + const notch = notchedOutline.children[1]; + expect(notch.children.length).toBe(1); + expect(notch.children[0].classList).toContain('mdc-floating-label'); + const floatingLabel = notch.children[0]; + + expect(hasRipple(root)).toBe(false, 'no ripple allowed on outlined inputs'); + + // input must be labelled by the floating label: + expect(floatingLabel.id).toMatch(/mdc-u-id-.*/); + expect(root.children[0].getAttribute('aria-labelledby')).toBe(floatingLabel.id); + })); + + it('value can be changed programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.value).toBe(null); + expect(element.value).toBe(''); + setAndCheck(fixture, 'ab'); + setAndCheck(fixture, ''); + setAndCheck(fixture, ' '); + setAndCheck(fixture, null); + })); + + it('value can be changed by user', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + + expect(testComponent.value).toBe(null); + expect(element.value).toEqual(''); + typeAndCheck(fixture, 'abc'); + typeAndCheck(fixture, ''); + })); + + it('can be disabled', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + testComponent.disabled = true; + fixture.detectChanges(); + expect(element.disabled).toBe(true); + expect(input.disabled).toBe(true); + expect(testComponent.disabled).toBe(true); + const field = fixture.debugElement.query(By.directive(MdcTextFieldDirective)).injector.get(MdcTextFieldDirective); + expect(field['isRippleSurfaceDisabled']()).toBe(true); + expect(field['root'].nativeElement.classList).toContain('mdc-text-field--disabled'); + + testComponent.disabled = false; + fixture.detectChanges(); + expect(element.disabled).toBe(false); + expect(input.disabled).toBe(false); + expect(testComponent.disabled).toBe(false); + expect(field['isRippleSurfaceDisabled']()).toBe(false); + expect(field['root'].nativeElement.classList).not.toContain('mdc-text-field--disabled'); + })); + + it('without label', fakeAsync(() => { + const { fixture, testComponent } = setup(); + const field = fixture.debugElement.query(By.directive(MdcTextFieldDirective)).injector.get(MdcTextFieldDirective); + expect(field['root'].nativeElement.classList).not.toContain('mdc-text-field--no-label'); + testComponent.labeled = false; + fixture.detectChanges(); tick(5); + expect(field['root'].nativeElement.classList).toContain('mdc-text-field--no-label'); + })); + + it('textarea', fakeAsync(() => { + const { fixture } = setup(TestTextareaComponent); + const root = fixture.nativeElement.querySelector('.mdc-text-field'); + expect(root.classList).toContain('mdc-text-field--textarea'); + expect(root.children.length).toBe(2); + expect(root.children[0].classList).toContain('mdc-text-field__input'); + expect(root.children[1].classList).toContain('mdc-notched-outline'); + expect(hasRipple(root)).toBe(false, 'no ripple allowed on outlined/textarea inputs'); + checkFloating(fixture, false); + typeAndCheck(fixture, 'typing text\nin my textarea', TestTextareaComponent); + })); + + it('helper text', fakeAsync(() => { + const { fixture, testComponent, element } = setup(TestWithHelperTextComponent); + testComponent.withHelperText = true; + const helperText: HTMLElement = fixture.nativeElement.querySelector('.mdc-text-field-helper-text'); + expect(helperText.id).toMatch(/mdc-u-id-[0-9]+/); + const helperId = helperText.id; + expect(helperText.classList).not.toContain('mdc-text-field-helper-text--persistent'); + expect(helperText.classList).not.toContain('mdc-text-field-helper-text--validation-msg'); + expect(element.getAttribute('aria-controls')).toBe(helperId); + expect(element.getAttribute('aria-describedby')).toBe(helperId); + testComponent.persistent = true; + fixture.detectChanges(); flush(); + expect(helperText.classList).toContain('mdc-text-field-helper-text--persistent'); + expect(helperText.classList).not.toContain('mdc-text-field-helper-text--validation-msg'); + testComponent.persistent = false; + testComponent.validation = true; + fixture.detectChanges(); flush(); + expect(helperText.classList).not.toContain('mdc-text-field-helper-text--persistent'); + expect(helperText.classList).toContain('mdc-text-field-helper-text--validation-msg'); + })); + + it('helper text dynamic ids', fakeAsync(() => { + const { fixture, testComponent, element } = setup(TestWithHelperTextDynamicIdComponent); + testComponent.withHelperText = true; + const helperText: HTMLElement = fixture.nativeElement.querySelector('.mdc-text-field-helper-text'); + expect(helperText.id).toBe('someId'); + expect(element.getAttribute('aria-controls')).toBe('someId'); + expect(element.getAttribute('aria-describedby')).toBe('someId'); + testComponent.helperId = 'otherId'; + fixture.detectChanges(); flush(); + expect(helperText.id).toBe('otherId'); + expect(element.getAttribute('aria-controls')).toBe('otherId'); + expect(element.getAttribute('aria-describedby')).toBe('otherId'); + })); + + it('icons', fakeAsync(() => { + const { fixture, testComponent } = setup(); + const root = fixture.nativeElement.querySelector('.mdc-text-field'); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon').length).toBe(0); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--leading').length).toBe(0); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--trailing').length).toBe(0); + expect(root.classList).not.toContain('mdc-text-field--with-leading-icon'); + expect(root.classList).not.toContain('mdc-text-field--with-trailing-icon'); + testComponent.leadingIcon = true; + fixture.detectChanges(); tick(5); fixture.detectChanges(); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon').length).toBe(1); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--leading').length).toBe(1); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--trailing').length).toBe(0); + expect(root.classList).toContain('mdc-text-field--with-leading-icon'); + expect(root.classList).not.toContain('mdc-text-field--with-trailing-icon'); + testComponent.trailingIcon = true; + fixture.detectChanges(); tick(5); fixture.detectChanges(); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon').length).toBe(2); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--leading').length).toBe(1); + expect(fixture.nativeElement.querySelectorAll('.mdc-text-field__icon--trailing').length).toBe(1); + expect(root.classList).toContain('mdc-text-field--with-leading-icon'); + expect(root.classList).toContain('mdc-text-field--with-trailing-icon'); + + const leadIcon = fixture.nativeElement.querySelector('.mdc-text-field__icon--leading'); + const trailIcon = fixture.nativeElement.querySelector('.mdc-text-field__icon--trailing'); + expect(leadIcon.getAttribute('role')).toBeNull(); // no interaction -> no role + expect(trailIcon.getAttribute('role')).toBe('button'); + expect(leadIcon.tabIndex).toBe(-1); // no interaction -> no tabIndex + expect(trailIcon.tabIndex).toBe(0); + testComponent.disabled = true; + fixture.detectChanges(); tick(5); fixture.detectChanges(); + expect(trailIcon.getAttribute('role')).toBeNull(); // disabled -> no role + expect(trailIcon.tabIndex).toBe(-1); // disabled -> no tabIndex + testComponent.disabled = false; + fixture.detectChanges(); tick(5); fixture.detectChanges(); + + // interactions: + expect(testComponent.trailingIconInteractions).toBe(0); + trailIcon.dispatchEvent(new Event('click')); + fixture.detectChanges(); + expect(testComponent.trailingIconInteractions).toBe(1); + })); + + function setAndCheck(fixture: ComponentFixture, value: any) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-text-field__input'); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + testComponent.value = value; + fixture.detectChanges(); flush(); + expect(element.value).toBe(value || ''); + expect(input.value).toBe(value || ''); + expect(testComponent.value).toBe(value); + + checkFloating(fixture, value != null && value.length > 0); + } + + function typeAndCheck(fixture: ComponentFixture, value: string, type: Type = TestComponent) { + const testComponent = fixture.debugElement.injector.get(type); + const element = fixture.nativeElement.querySelector('.mdc-text-field__input'); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + element.value = value; + element.dispatchEvent(new Event('focus')); + element.dispatchEvent(new Event('input')); + element.dispatchEvent(new Event('blur')); // focus/blur events triggered for testing label float depending on value after blur + tick(); fixture.detectChanges(); + expect(element.value).toBe(value); + expect(input.value).toBe(value); + expect(testComponent.value).toBe(value); + + checkFloating(fixture, value != null && value.length > 0); + } + + @Component({ + template: ` + + ` + }) + class TestComponent { + value: any = null; + outlined: any = null; + disabled: any = null; + labeled = true; + withHelperText = false; + leadingIcon = false; + trailingIcon = false; + trailingIconInteractions = 0; + onInput(e) { + this.value = e.target.value; + } + trailingIconInteract() { + ++this.trailingIconInteractions; + } + } + + @Component({ + template: ` + + ` + }) + class TestTextareaComponent { + value: any = null; + onInput(e) { + this.value = e.target.value; + } + } + + @Component({ + template: ` + +
+
helper text
+
+ ` + }) + class TestWithHelperTextComponent { + value: any = null; + persistent: any = null; + validation: any = null; + onInput(e) { + this.value = e.target.value; + } + } + + @Component({ + template: ` + +
+
helper text
+
+ ` + }) + class TestWithHelperTextDynamicIdComponent { + value: any = null; + helperId = 'someId'; + onInput(e) { + this.value = e.target.value; + } + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + declarations: [ + MdcTextFieldDirective, MdcTextFieldInputDirective, MdcTextFieldIconDirective, + MdcTextFieldHelperLineDirective, MdcTextFieldHelperTextDirective, + MdcFloatingLabelDirective, + MdcNotchedOutlineNotchDirective, MdcNotchedOutlineDirective, + compType] + }).createComponent(compType); + fixture.detectChanges(); flush(); + const testComponent = fixture.debugElement.injector.get(compType); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + const element: HTMLInputElement = fixture.nativeElement.querySelector('.mdc-text-field__input'); + return { fixture, testComponent, input, element }; + } +}); + +describe('MdcTextFieldDirective with FormsModule', () => { + it('ngModel can be set programmatically', fakeAsync(() => { + const { fixture, testComponent, element } = setup(); + expect(testComponent.value).toBe(null); + expect(element.value).toBe(''); + setAndCheck(fixture, 'ab'); + setAndCheck(fixture, ''); + setAndCheck(fixture, ' '); + setAndCheck(fixture, null); + })); + + it('ngModel can be changed by updating value property', fakeAsync(() => { + const { fixture, testComponent, input } = setup(); + + input.value = 'new value'; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe('new value'); + checkFloating(fixture, true); + + input.value = ''; + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(''); + checkFloating(fixture, false); + + input.value = null; // the browser will change this to '' + fixture.detectChanges(); tick(); + expect(testComponent.value).toBe(''); + checkFloating(fixture, false); + })); + + it('ngModel can be changed by user', fakeAsync(() => { + const { fixture, element, testComponent } = setup(); + + expect(testComponent.value).toBe(null); + expect(element.value).toEqual(''); + typeAndCheck(fixture, 'abc'); + typeAndCheck(fixture, ''); + })); + + it('can be disabled', fakeAsync(() => { + const { fixture, testComponent, element, input } = setup(); + + testComponent.disabled = true; + fixture.detectChanges(); tick(); fixture.detectChanges(); + expect(element.disabled).toBe(true); + expect(input.disabled).toBe(true); + expect(testComponent.disabled).toBe(true); + const field = fixture.debugElement.query(By.directive(MdcTextFieldDirective)).injector.get(MdcTextFieldDirective); + expect(field['isRippleSurfaceDisabled']()).toBe(true); + expect(field['root'].nativeElement.classList).toContain('mdc-text-field--disabled'); + + testComponent.disabled = false; + fixture.detectChanges(); tick(); fixture.detectChanges(); + expect(element.disabled).toBe(false); + expect(input.disabled).toBe(false); + expect(testComponent.disabled).toBe(false); + expect(field['isRippleSurfaceDisabled']()).toBe(false); + expect(field['root'].nativeElement.classList).not.toContain('mdc-text-field--disabled'); + })); + + function setAndCheck(fixture: ComponentFixture, value: any) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-text-field__input'); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + testComponent.value = value; + fixture.detectChanges(); flush(); + expect(element.value).toBe(value || ''); + expect(input.value).toBe(value || ''); + expect(testComponent.value).toBe(value); + + checkFloating(fixture, value != null && value.length > 0); + } + + function typeAndCheck(fixture: ComponentFixture, value: string) { + const testComponent = fixture.debugElement.injector.get(TestComponent); + const element = fixture.nativeElement.querySelector('.mdc-text-field__input'); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + element.value = value; + element.dispatchEvent(new Event('focus')); + element.dispatchEvent(new Event('input')); + element.dispatchEvent(new Event('blur')); // focus/blur events triggered for testing label float depending on value after blur + tick(); fixture.detectChanges(); + expect(element.value).toBe(value); + expect(input.value).toBe(value); + expect(testComponent.value).toBe(value); + + checkFloating(fixture, value != null && value.length > 0); + } + + @Component({ + template: ` + + ` + }) + class TestComponent { + value: any = null; + outlined: any = null; + disabled: any = null; + } + + function setup(compType: Type = TestComponent) { + const fixture = TestBed.configureTestingModule({ + imports: [FormsModule], + declarations: [ + MdcTextFieldDirective, MdcTextFieldInputDirective, MdcTextFieldIconDirective, + MdcTextFieldHelperLineDirective, MdcTextFieldHelperTextDirective, + MdcFloatingLabelDirective, + MdcNotchedOutlineNotchDirective, MdcNotchedOutlineDirective, + compType] + }).createComponent(compType); + fixture.detectChanges(); flush(); + const testComponent = fixture.debugElement.injector.get(compType); + const input = fixture.debugElement.query(By.directive(MdcTextFieldInputDirective))?.injector.get(MdcTextFieldInputDirective); + const element = fixture.nativeElement.querySelector('.mdc-text-field__input'); + return { fixture, testComponent, input, element }; + } +}); + +function checkFloating(fixture: ComponentFixture, expected: boolean) { + // when not empty, the label must be floating: + const floatingLabelElm = fixture.nativeElement.querySelector('.mdc-floating-label'); + if (floatingLabelElm) { + if (expected) + expect(floatingLabelElm.classList).toContain('mdc-floating-label--float-above'); + else + expect(floatingLabelElm.classList).not.toContain('mdc-floating-label--float-above'); + } +} diff --git a/bundle/src/components/text-field/mdc.text-field.directive.ts b/bundle/src/components/text-field/mdc.text-field.directive.ts index 048cfa0..c2b167f 100644 --- a/bundle/src/components/text-field/mdc.text-field.directive.ts +++ b/bundle/src/components/text-field/mdc.text-field.directive.ts @@ -1,41 +1,48 @@ -import { AfterContentInit, ContentChild, ContentChildren, Directive, ElementRef, forwardRef, HostBinding, - HostListener, Input, OnDestroy, OnInit, Optional, QueryList, Renderer2, Self } from '@angular/core'; +import { AfterContentInit, ContentChildren, Directive, ElementRef, forwardRef, HostBinding, + HostListener, Input, OnDestroy, OnInit, Optional, QueryList, Renderer2, Self, Output, EventEmitter, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; import { NgControl } from '@angular/forms'; -import { MDCTextFieldFoundation } from '@material/textfield'; -import { MDCLineRippleFoundation } from '@material/line-ripple'; -import { MDCTextFieldHelperTextFoundation } from '@material/textfield/helper-text'; -import { MDCTextFieldIconFoundation } from '@material/textfield/icon'; -import { MdcTextFieldAdapter, MdcTextFieldIconAdapter, MdcTextFieldHelperTextAdapter } from './mdc.text-field.adapter'; +import { MDCTextFieldFoundation, MDCTextFieldAdapter } from '@material/textfield'; +import { MDCLineRippleFoundation, MDCLineRippleAdapter } from '@material/line-ripple'; +import { MDCTextFieldHelperTextFoundation, MDCTextFieldHelperTextAdapter } from '@material/textfield'; +import { MDCTextFieldIconFoundation, MDCTextFieldIconAdapter } from '@material/textfield'; import { MdcFloatingLabelDirective } from '../floating-label/mdc.floating-label.directive'; -import { MdcLineRippleAdapter } from '../line-ripple/mdc.line-ripple.adapter'; import { AbstractMdcInput } from '../abstract/abstract.mdc.input'; -import { asBoolean } from '../../utils/value.utils'; +import { asBoolean, asNumberOrNull } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; -import { NotchedOutlineSupport } from '../notched-outline/notched-outline.support'; +import { MdcNotchedOutlineDirective } from '../notched-outline/mdc.notched-outline.directive'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -const CLASS_LINE_RIPPLE = 'mdc-line-ripple'; +import { Subject, merge } from 'rxjs'; +import { takeUntil, debounceTime } from 'rxjs/operators'; +import { HasId } from '../abstract/mixin.mdc.hasid'; +import { applyMixins } from '../../utils/mixins'; let nextId = 1; /** - * Directive for the native input of a text-field (see MdcTextFieldDirective). - * Add this as the first child to an mdcTextField (or as the second child - * when you want to have a leading icon on the text-field). + * Directive for the native input of an `mdcTextField`. */ @Directive({ selector: 'input[mdcTextFieldInput], textarea[mdcTextFieldInput]', providers: [{provide: AbstractMdcInput, useExisting: forwardRef(() => MdcTextFieldInputDirective) }] }) -export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnInit { - _onChange = (value) => {}; - private _id: string; +export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-text-field__input') readonly _cls = true; + /** @internal */ + @HostBinding('attr.aria-labelledby') _labeledBy: string | null = null; + /** @internal */ + @HostBinding('attr.aria-controls') _controls: string | null = null; + /** @internal */ + @HostBinding('attr.aria-describedby') _describedBy: string | null = null; + /** @internal */ + @Output() readonly _valueChange: EventEmitter = new EventEmitter(); + private onDestroy$: Subject = new Subject(); + private _id: string | null = null; private _type = 'text'; + private _value = ''; private _disabled = false; - private _required = false; - private cachedId: string; - _focused = false; - @HostBinding('class.mdc-text-field__input') _hostClass = true; + private cachedId: string | null = null; constructor(public _elm: ElementRef, private renderer: Renderer2, @Optional() @Self() public _cntr: NgControl) { super(); @@ -44,25 +51,32 @@ export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnIn ngOnInit() { // Force setter to be called in case id was not specified. this.id = this.id; - if (this._cntr) { - this._cntr.valueChanges.subscribe(value => { - this._onChange(value); - }); - } + + this._cntr?.valueChanges!.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + // (using the value of the elemnt, because the value of the control might be of another type, + // e.g. the ngModel for type=number inputs is a number) + this.updateValue(this._elm.nativeElement.value, true); + }); + } + + ngOnDestroy() { + this.onDestroy$.next(); + this.onDestroy$.complete(); } /** * Mirrors the id attribute. If no id is assigned, this directive will * assign a unique id by itself. If an mdcFloatingLabel for this text-field - * is available, the mdcFloatingLabel will automatically set its for - * attribute to this id value. + * is available, the mdcFloatingLabel will automatically be associated + * (either by a `for` attribute on the label, or by an `aria-labelledby` attribute + * on this input element). */ @HostBinding() @Input() get id() { return this._id; } - set id(value: string) { + set id(value: string | null) { this._id = value || this._newId(); } @@ -71,14 +85,16 @@ export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnIn */ @HostBinding() @Input() get disabled() { - return this._cntr ? this._cntr.disabled : this._disabled; + return this._cntr ? !!this._cntr.disabled : this._disabled; } - set disabled(value: any) { + set disabled(value: boolean) { this._disabled = asBoolean(value); } - /** @docs-private */ + static ngAcceptInputType_disabled: boolean | ''; + + /** @internal */ @Input() get type() { return this._type; } @@ -91,53 +107,54 @@ export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnIn try { this.renderer.setProperty(this._elm.nativeElement, 'type', this._type); } catch (e) { - (this.renderer).setElementProperty(this._elm.nativeElement, 'type', this._type); + this.renderer.setAttribute(this._elm.nativeElement, 'type', this._type); } } } - /** @docs-private */ - get value() { - return this._elm.nativeElement.value; + /** @internal */ + @Input() get value() { + return this._value; } - /** @docs-private */ + /** @internal */ set value(value: string) { - this._elm.nativeElement.value = value; - this._onChange(value); - } - - /** @docs-private */ - focus() { - this._elm.nativeElement.focus(); + this.updateValue(value, false); } - @HostListener('focus') _onFocus() { - this._focused = true; - } - - @HostListener('blur') _onBlur() { - this._focused = false; + private updateValue(value: any, fromControl: boolean) { + const newVal = (value ? `${value}` : ''); + if (newVal !== this._value) { + this._value = this._elm.nativeElement.value = newVal; + this._valueChange.emit(this._elm.nativeElement.value); + } + if (!fromControl && this._cntr && newVal !== this._cntr.value) { + this._cntr.control!.setValue(newVal); // TODO how to convert to the type of value the controlpects? + } } + /** @internal */ @HostListener('input') _onInput() { - // Having a listener for input changes forces a change detection for each 'input' event. - // Necessary in some edge cases. + if (!this._cntr) + this.updateValue(this._elm.nativeElement.value, false); } - /** @docs-private */ + /** @internal */ get valid(): boolean { - return this._cntr ? this._cntr.valid : (this._elm.nativeElement as HTMLInputElement).validity.valid; + return this._cntr ? !!this._cntr.valid : (this._elm.nativeElement as HTMLInputElement).validity.valid; } + /** @internal */ _isBadInput() { return (this._elm.nativeElement as HTMLInputElement).validity.badInput; } + /** @internal */ _isTextarea() { return this._elm.nativeElement.nodeName.toLowerCase() === 'textarea'; } + /** @internal */ _newId(): string { this.cachedId = this.cachedId || `mdc-input-${nextId++}`; return this.cachedId; @@ -146,75 +163,163 @@ export class MdcTextFieldInputDirective extends AbstractMdcInput implements OnIn /** * Directive for an optional leading or trailing icon on the text-field (see - * MdcTextFieldDirective). Add this as the first child to an mdcTextField - * for a leading icon, or as the last child for a trailing icon. + * `MdcTextFieldDirective`). An icon before the `mdcTextFieldInput` will be styled + * as a leading icon. An icon after the `mdcTextFieldInput` will be styles as a + * trailing icon. */ @Directive({ selector: '[mdcTextFieldIcon]' }) -export class MdcTextFieldIconDirective { - @HostBinding('class.mdc-text-field__icon') _cls = true; - _mdcAdapter: MdcTextFieldIconAdapter = { - getAttr: (name: string) => this._el.nativeElement.getAttribute(name), +export class MdcTextFieldIconDirective implements AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-text-field__icon') readonly _cls = true; + /** + * Event emitted for icon interactions (a click or an 'enter' keypress). When this output is assigned, + * the icon will also set the `role=button` and `tabindex=0` attributes, unless you give them another + * explicit value. + */ + @Output() readonly interact: EventEmitter = new EventEmitter(); + /** @internal */ + @HostBinding('class.mdc-text-field__icon--leading') _leading = false; + /** @internal */ + @HostBinding('class.mdc-text-field__icon--trailing') _trailing = false; + private _tabIndex: number | null = null; + private _role: string | null = null; + /** @internal */ + _textField: MdcTextFieldDirective | null = null; + + /** @internal */ + _mdcAdapter: MDCTextFieldIconAdapter = { + // by returning null for 'tabindex', the foundation will not set tabindex/role attributes when + // disabled state changes. We want that, because we handle tabindex/role ourselves: + getAttr: (name: string) => name === 'tabindex' ? null : this._el.nativeElement.getAttribute(name), setAttr: (name: string, value: string) => this._rndr.setAttribute(this._el.nativeElement, name, value), removeAttr: (name: string) => this._rndr.removeAttribute(this._el.nativeElement, name), setContent: (content: string) => this._el.nativeElement.textContent = content, - registerInteractionHandler: (evtType: string, handler: EventListener) => { - this._reg.listen(this._rndr, evtType, handler, this._el); - }, - deregisterInteractionHandler: (evtType: string, handler: EventListener) => { - this._reg.unlisten(evtType, handler); - }, - notifyIconAction: () => { - // ignored, the normal (click) event handler is already available for this in angular - } + registerInteractionHandler: (evtType, handler) => this._reg.listen(this._rndr, evtType, handler, this._el), + deregisterInteractionHandler: (evtType, handler) => this._reg.unlisten(evtType, handler), + notifyIconAction: () => !this._textField?._disabled && this.interact.emit() }; - _foundation: { - init: Function, - destroy: Function - } = new MDCTextFieldIconFoundation(this._mdcAdapter); + /** @internal */ + _foundation: MDCTextFieldIconFoundation | null = new MDCTextFieldIconFoundation(this._mdcAdapter); constructor(private _rndr: Renderer2, public _el: ElementRef, private _reg: MdcEventRegistry) { } + + ngAfterContentInit() { + this._foundation!.init(); + } + + ngOnDestroy() { + this._foundation?.destroy(); + this._foundation = null; + } + + /** + * The `tabindex` for icons defaults to `null` (no tabindex set) for icons without + * subscriptions to the `interact` output, and to `0` for icons that have an `interact` + * binding. You can override this default, by setting a non-null value for this property. + */ + @HostBinding('attr.tabindex') @Input() get tabindex() { + if (this.interact.observers.length > 0 && this._tabIndex == null && !this._textField?._disabled) + return 0; + return this._tabIndex; + } + + set tabindex(value) { + this._tabIndex = asNumberOrNull(value); + } + + static ngAcceptInputType_tabindex: string | number | null; + + /** + * The `role` attribute for icons defaults to `null` (no role set) for icons without + * subscriptions to the `interact` output, and to `button` for icons that have an `interact` + * binding. You can override this default, by setting a non-null value for this property. + */ + @HostBinding('attr.role') @Input() get role() { + if (this.interact.observers.length > 0 && this._role == null && !this._textField?._disabled) + return 'button'; + return this._role; + } + + set role(value) { + this._role = value; + } } +/** + * This directive wraps an optional `mdcTextFieldHelperText`. It should be the next sibling of the + * associated `mdcTextField` if used. See `mdcTextFieldHelperText` for more info. + */ +@Directive({ + selector: '[mdcTextFieldHelperLine]', +}) +export class MdcTextFieldHelperLineDirective { + /** @internal */ + @HostBinding('class.mdc-text-field-helper-line') readonly _cls = true; +} + +@Directive() +class MdcTextFieldHelperTextDirectiveBase {} +interface MdcTextFieldHelperTextDirectiveBase extends HasId {} +applyMixins(MdcTextFieldHelperTextDirectiveBase, [HasId]); /** * Directive for an optional helper-text to show supplemental information or validation - * messages for an mdcTextField. - * Add this just after the mdcTextField as a sibbling element to the - * mdcTextField. Then export it as a mdcHelperText, and + * messages for an mdcTextField. This directive should be wrapped inside an + * `mdcTextFieldHelperLine` that comes directly after the `mdcTextField` it belongs to. + * Additionally, you must export it as an mdcHelperText, and * assign the exported object to the helperText property of the * mdcHelperText. See the examples for hints on how to do this. + * + * The `mdcTextFieldInput` of the textfield will get `aria-controls` and `aria-describedby` + * accessibility attributes that point to the `id` of this helpertext element. If no `id` has + * been assigned, a unique `id` attribute will automatically be assigned. If the `id` attribute + * is changed, the aria attributes on the `mdcTextFieldInput` will be updated accordingly. */ @Directive({ selector: '[mdcTextFieldHelperText]', exportAs: 'mdcHelperText' }) -export class MdcTextFieldHelperTextDirective { - @HostBinding('class.mdc-text-field-helper-text') _cls = true; - @HostBinding('class.mdc-text-field-helper-text--validation-msg') _validation = false; - @HostBinding('class.mdc-text-field-helper-text--persistent') _persistent = false; - _mdcAdapter: MdcTextFieldHelperTextAdapter = { +export class MdcTextFieldHelperTextDirective extends MdcTextFieldHelperTextDirectiveBase implements OnInit, AfterContentInit, OnDestroy { + /** @internal */ + @HostBinding('class.mdc-text-field-helper-text') readonly _cls = true; + private _validation = false; + private _persistent = false; + /** @internal */ + _mdcAdapter: MDCTextFieldHelperTextAdapter = { addClass: (className: string) => this._rndr.addClass(this._elm.nativeElement, className), removeClass: (className: string) => this._rndr.removeClass(this._elm.nativeElement, className), hasClass: (className) => this._elm.nativeElement.classList.contains(className), setAttr: (name: string, value: string) => this._rndr.setAttribute(this._elm.nativeElement, name, value), removeAttr: (name: string) => this._rndr.removeAttribute(this._elm.nativeElement, name), - setContent: (content: string) => { + setContent: () => { // helperText content can be set by simply wrapping (dynamic) content in the directive. // this is much more powerful than setContent, because it can also include html markup // therefore there is no reason to do anything with setContent throw new Error("MdcTextFieldHelperTextAdapter.setContent not supported"); } }; - _foundation: { - init(), - destroy(), - showToScreenReader(): boolean, - setValidity(isValid: boolean) - } = new MDCTextFieldHelperTextFoundation(this._mdcAdapter); + /** @internal */ + _foundation: MDCTextFieldHelperTextFoundation | null = null; constructor(private _rndr: Renderer2, public _elm: ElementRef) { + super(); + } + + ngOnInit() { + this.initId(); + } + + ngAfterContentInit() { + this._foundation = new MDCTextFieldHelperTextFoundation(this._mdcAdapter); + this._foundation.setPersistent(this._persistent); + this._foundation.setValidation(this._validation); + } + + ngOnDestroy() { + this._foundation?.destroy(); + this._foundation = null; } /** @@ -223,247 +328,300 @@ export class MdcTextFieldHelperTextDirective { */ @Input() set validation(value: boolean) { this._validation = asBoolean(value); + if (this._foundation) + this._foundation.setValidation(this._validation); } + static ngAcceptInputType_validation: boolean | ''; + /** * If set to a value other than false, the helper text is always visible. * Otherwise the helper text will only be shown when the input has focus - * (or when validation is set, when the input is invalid). + * (or if `validation` is set, when the input is invalid). */ @Input() set persistent(value: boolean) { this._persistent = asBoolean(value); + if (this._foundation) + this._foundation.setPersistent(this._persistent); } + + static ngAcceptInputType_persistent: boolean | ''; } /** - * Material design text-field. It is required to add at least an input - * (mdcTextFieldInput), and a label (mdcFloatingLabel) as child - * elements. + * Material design text-field. Text fields can be filled or outlined. + * + * Filled text-fields should have the following child directives: + * * `mdcTextFieldIcon` (optional leading icon) + * * `mdcTextFieldInput` (required, the native input) + * * `mdcTextFieldIcon` (optional trailing icon) + * * `mdcFloatingLabel` (optional floating label) + * + * Outlined text-fields should have the following child directives: + * * `mdcTextFieldIcon` (optional leading icon) + * * `mdcTextFieldInput` (required, the native input) + * * `mdcTextFieldIcon` (optional trailing icon) + * * `mdcNotchedOutline` (the outline, which can also contain an optional `mdcFloatingLabel`) + * + * Addditionally the text-field can be followed by an `mdcTextFieldHelperLine` containing an + * `mdcHelperText`. */ @Directive({ selector: '[mdcTextField]', providers: [{provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcTextFieldDirective) }] }) export class MdcTextFieldDirective extends AbstractMdcRipple implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-text-field') _cls = true; - @ContentChild(MdcTextFieldIconDirective) _icon: MdcTextFieldIconDirective; - @ContentChild(MdcTextFieldInputDirective) _input: MdcTextFieldInputDirective; - @ContentChild(MdcFloatingLabelDirective) _label: MdcFloatingLabelDirective; - @ContentChildren('label', {descendants: true, read: ElementRef}) _labels: QueryList; - private _outlineSupport: NotchedOutlineSupport; - private _helperText: MdcTextFieldHelperTextDirective; - private _initialized = false; - private _box = false; - private _outlined = false; - private _dense = false; - private _bottomLineElm: HTMLElement = null; - private _valid: boolean = null; - private mdcLineRippleAdapter: MdcLineRippleAdapter = { + private onDestroy$: Subject = new Subject(); + private onInputChange$: Subject = new Subject(); + private onHelperTextChange$: Subject = new Subject(); + /** @internal */ + @HostBinding('class.mdc-text-field') readonly _cls = true; + /** @internal */ + @ContentChildren(MdcTextFieldIconDirective) _icons?: QueryList; + /** @internal */ + @ContentChildren(MdcTextFieldInputDirective) _inputs?: QueryList; + /** @internal */ + @ContentChildren(MdcFloatingLabelDirective, {descendants: true}) _floatingLabels?: QueryList; + /** @internal */ + @ContentChildren(MdcNotchedOutlineDirective) _outlines?: QueryList; + private _leadingIcon: MdcTextFieldIconDirective | null = null; + private _trailingIcon: MdcTextFieldIconDirective | null = null; + private _helperText: MdcTextFieldHelperTextDirective | null = null; + private _bottomLineElm: HTMLElement | null = null; + private _valid: boolean | null = null; + private mdcLineRippleAdapter: MDCLineRippleAdapter = { addClass: (className: string) => this.renderer.addClass(this._bottomLineElm, className), removeClass: (className: string) => this.renderer.removeClass(this._bottomLineElm, className), - hasClass: (className) => this._bottomLineElm.classList.contains(className), + hasClass: (className) => this._bottomLineElm!.classList.contains(className), setStyle: (name: string, value: string) => this.renderer.setStyle(this._bottomLineElm, name, value), - registerEventHandler: (evtType: string, handler: EventListener) => this.registry.listenElm(this.renderer, evtType, handler, this._bottomLineElm), - deregisterEventHandler: (evtType: string, handler: EventListener) => this.registry.unlisten(evtType, handler) + registerEventHandler: (evtType, handler) => this.registry.listenElm(this.renderer, evtType, handler, this._bottomLineElm!), + deregisterEventHandler: (evtType, handler) => this.registry.unlisten(evtType, handler) }; - private mdcAdapter: MdcTextFieldAdapter = { - addClass: (className: string) => { - this.renderer.addClass(this.root.nativeElement, className); - }, - removeClass: (className: string) => { - this.renderer.removeClass(this.root.nativeElement, className); - }, - hasClass: (className) => { - if (className === 'mdc-text-field--dense') - return this._dense; - return this.root.nativeElement.classList.contains(className); - }, - registerTextFieldInteractionHandler: (evtType: string, handler: EventListener) => { + private mdcAdapter: MDCTextFieldAdapter = { + addClass: (className) => this.renderer.addClass(this.root.nativeElement, className), + removeClass: (className) => this.renderer.removeClass(this.root.nativeElement, className), + hasClass: (className) => this.root.nativeElement.classList.contains(className), + registerTextFieldInteractionHandler: (evtType, handler) => { this.registry.listen(this.renderer, evtType, handler, this.root); }, - deregisterTextFieldInteractionHandler: (evtType: string, handler: EventListener) => { - this.registry.unlisten(evtType, handler); - }, - registerInputInteractionHandler: (evtType: string, handler: EventListener) => { - if (this._input) - this.registry.listen(this.renderer, evtType, handler, this._input._elm); - }, - deregisterInputInteractionHandler: (evtType: string, handler: EventListener) => { + deregisterTextFieldInteractionHandler: (evtType, handler) => { this.registry.unlisten(evtType, handler); }, + registerInputInteractionHandler: (evtType, handler) => this._input && this.registry.listen(this.renderer, evtType, handler, this._input._elm), + deregisterInputInteractionHandler: (evtType, handler) => this.registry.unlisten(evtType, handler), registerValidationAttributeChangeHandler: (handler: (arg: Array) => void) => { - const getAttributesList = (mutationsList) => mutationsList.map((mutation) => mutation.attributeName); + const getAttributesList = (mutationsList: any) => mutationsList + .map((mutation: any) => mutation.attributeName) + .filter((attrName: string) => attrName); const observer = new MutationObserver((mutationsList) => handler(getAttributesList(mutationsList))); - observer.observe(this._input._elm.nativeElement, {attributes: true}); + observer.observe(this._input!._elm.nativeElement, {attributes: true}); return observer; }, deregisterValidationAttributeChangeHandler: (observer: MutationObserver) => observer.disconnect(), - getNativeInput: () => { - return { - value: this._input.value, - disabled: this._input.disabled, - validity: { - valid: this._valid == null ? this._input.valid : !!this._valid, - badInput: this._input._isBadInput() - } - }; - }, - isFocused: () => this._input && this._input._focused, - isRtl: () => getComputedStyle(this.root.nativeElement).getPropertyValue('direction') === 'rtl', - activateLineRipple: () => { - if (this._bottomLineElm) - this.bottomLineFoundation.activate(); - }, - deactivateLineRipple: () => { - if (this._bottomLineElm) - this.bottomLineFoundation.deactivate(); - }, - setLineRippleTransformOrigin: (normalizedX: number) => { - if (this._bottomLineElm) - this.bottomLineFoundation.setRippleCenter(normalizedX); - }, - shakeLabel: (shouldShake: boolean) => this._label._foundation.shake(shouldShake), - floatLabel: (shouldFloat: boolean) => this._label._foundation.float(shouldFloat), - hasLabel: () => !!this._label, - getLabelWidth: () => this._label._foundation.getWidth(), - hasOutline: () => this._outlined, - notchOutline: (labelWidth: number, isRtl: boolean) => { - this._outlineSupport.foundation.notch(labelWidth, isRtl); - }, - closeOutline: () => { - this._outlineSupport.foundation.closeNotch(); - } - }; - private bottomLineFoundation: { - init: Function, - destroy: Function, - activate: Function, - deactivate: Function, - setRippleCenter: (x: number) => void - } = new MDCLineRippleFoundation(this.mdcLineRippleAdapter); - private foundation: { - init: Function, - destroy: Function, - readonly shouldFloat: boolean, - notchOutline(openNotch: boolean), - useCustomValidityChecking_: boolean, - setValid(isValid: boolean), - changeValidity_(isValid: boolean) + getNativeInput: () => ({ + value: this._input!.value, + disabled: this._input!.disabled, + maxLength: this._input!._elm.nativeElement.maxLength, + type: this._input!.type, + validity: { + valid: this._valid == null ? this._input!.valid : !!this._valid, + badInput: this._input!._isBadInput() + } + }), + isFocused: () => !!this._input && document.activeElement === this._input._elm.nativeElement, + shakeLabel: (shouldShake: boolean) => this._floatingLabel?.shake(shouldShake), + floatLabel: (shouldFloat: boolean) => this._floatingLabel?.float(shouldFloat), + hasLabel: () => !!this._floatingLabel, + getLabelWidth: () => this._floatingLabel ? this._floatingLabel.getWidth() : 0, + activateLineRipple: () => this.bottomLineFoundation?.activate(), + deactivateLineRipple: () => this.bottomLineFoundation?.deactivate(), + setLineRippleTransformOrigin: (normalizedX: number) => this.bottomLineFoundation?.setRippleCenter(normalizedX), + hasOutline: () => !!this._outline, + notchOutline: (labelWidth: number) => this._outline?.open(labelWidth), + closeOutline: () => this._outline?.close() }; - - constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry) { - super(root, renderer, registry); - this._outlineSupport = new NotchedOutlineSupport(root, renderer); - } - - ngAfterContentInit() { - if (this._label && this._input && !this._label.for) - this._label.for = this._input.id; - if (this._label && !this._label._initialized) - throw new Error('mdcFloatingLabel initialized after parent mdcTextField') - - this._initialized = true; + private bottomLineFoundation: MDCLineRippleFoundation | null = null; + private foundation: MDCTextFieldFoundation | null = null; + + constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry, @Inject(DOCUMENT) doc: any) { + super(root, renderer, registry, doc as Document); + } + + ngAfterContentInit() { + merge( + this._floatingLabels!.changes, + this._icons!.changes, + this._inputs!.changes, + this._outlines!.changes, + this.onHelperTextChange$ + ).pipe( + takeUntil(this.onDestroy$), + debounceTime(1) + ).subscribe(() => { + this.reconstructComponent(); + }); this.initComponent(); - - // TODO: we should actually reassign this if mdcInput changes (@ContentChildren instead of @ContentChild) - if (this._input) - this._input._onChange = (value) => { - if (this._input && this._label && !this._input._focused) { - // programmatic changes to the input value are not seen by the foundation, - // but some states should be updated with the new value: - let shouldFloat = value != null && value.toString().length !== 0; - this._label._foundation.float(shouldFloat); - this.foundation.notchOutline(shouldFloat); - } - } } ngOnDestroy() { + this.onInputChange$.next(); this.onInputChange$.complete(); + this.onDestroy$.next(); this.onDestroy$.complete(); + this.onHelperTextChange$.complete(); this.destroyComponent(); - this._input._onChange = (value) => {}; } private initComponent() { - this.initLineRipple(); - this.initBox(); - this.initOutline(); + if (this._input && !this._outline && !this._input._isTextarea()) { + this.addRippleSurface('mdc-text-field__ripple', true); + this.initRipple(); + this.initLineRipple(); + } + this.attachLabelToInput(); + this.attachHelperTextToInput(); + this.initIcons(); this.foundation = new MDCTextFieldFoundation(this.mdcAdapter, { - lineRipple: this._outlined ? null : this.bottomLineFoundation, - helperText: this.helperText ? this.helperText._foundation : undefined, - icon: this._icon ? this._icon._foundation : undefined, - label: this._label ? this._label._foundation : undefined, - + helperText: this.helperText?._foundation ? this.helperText._foundation : undefined, + leadingIcon: this._leadingIcon?._foundation ? this._leadingIcon._foundation : undefined, + trailingIcon: this._trailingIcon?._foundation ? this._trailingIcon._foundation : undefined }); - if (this._helperText) - this._helperText._foundation.init(); - if (this._icon) - this._icon._foundation.init(); this.foundation.init(); + this.subscribeInputChanges(); + if (this._helperText) { + this._helperText.idChange().pipe( + takeUntil(this.onDestroy$), + takeUntil(this.onHelperTextChange$) + ).subscribe(() => this.attachHelperTextToInput()); + } } private destroyComponent() { + this.destroyRippleSurface(); + this.destroyRipple(); this.destroyLineRipple(); - this.destroyBox(); - this.destroyOutline(); - if (this._helperText) - this._helperText._foundation.destroy(); - if (this._helperText) - this._helperText._foundation.destroy(); - if (this._icon) - this._icon._foundation.destroy(); - this.foundation.destroy(); + this.foundation?.destroy(); + this.foundation = null; } private reconstructComponent() { - if (this._initialized) { - this.destroyComponent(); - this.initComponent(); - this.recomputeOutline(); - } + this.destroyComponent(); + this.initComponent(); + this.recomputeOutline(); // TODO check if we still need this with latest material-components-web } private initLineRipple() { - if (!this._outlined) { + if (!this._outline) { this._bottomLineElm = this.renderer.createElement('div'); - this.renderer.addClass(this._bottomLineElm, CLASS_LINE_RIPPLE); + this.renderer.addClass(this._bottomLineElm, 'mdc-line-ripple'); this.renderer.appendChild(this.root.nativeElement, this._bottomLineElm); + this.bottomLineFoundation = new MDCLineRippleFoundation(this.mdcLineRippleAdapter); this.bottomLineFoundation.init(); } } private destroyLineRipple() { if (this._bottomLineElm) { - this.bottomLineFoundation.destroy(); + this.bottomLineFoundation?.destroy(); + this.bottomLineFoundation = null; this.renderer.removeChild(this.root.nativeElement, this._bottomLineElm); this._bottomLineElm = null; } } - private initBox() { - if (this._box) - this.initRipple(); + private recomputeOutline() { + if (this._outline) { + // the outline may not be valid after re-initialisation, recompute outline when all + // style/structural changes have been employed: + setTimeout(() => {this.foundation?.notchOutline(this.foundation.shouldFloat); }, 0); + } } - private destroyBox() { - this.destroyRipple(); + private initIcons() { + this._leadingIcon = this.computeLeadingIcon(); + this._trailingIcon = this.computeTrailingIcon(this._leadingIcon); + this._icons!.forEach(icon => { + icon._textField = this; + icon._leading = icon === this._leadingIcon; + icon._trailing = icon === this._trailingIcon; + }); } + private computeLeadingIcon() { + if (this._icons!.length > 0) { + let icon = this._icons!.first; + let prev = this.previousElement(icon._el.nativeElement); + let last = icon._el.nativeElement; + while (true) { + // if it is contained in another element, check the siblings of the container too: + if (prev == null && last != null && last.parentElement !== this.root.nativeElement) + prev = last.parentElement; + // no more elements before, must be the leading icon: + if (prev == null) + return icon; + // comes after the text, so it's not the leading icon: + if (this._input && (prev === this._input._elm.nativeElement || prev.contains(this._input._elm.nativeElement))) + return null; + last = prev; + prev = this.previousElement(prev); + } + } + return null; + } - private initOutline() { - if (this._outlined) - this._outlineSupport.init(); + private computeTrailingIcon(leading: MdcTextFieldIconDirective | null) { + if (this._icons!.length > 0) { + let icon = this._icons!.last; + if (icon === leading) + return null; + // if not the leading icon, it must be the trailing icon: + return icon; + } + return null; } - private destroyOutline() { - this._outlineSupport.destroy(); + private previousElement(el: Element): Element { + let result = el.previousSibling; + while (result != null && !(result instanceof Element)) + result = result.previousSibling; + return result; } - private recomputeOutline() { - if (this._outlined) { - // the outline may not be valid after re-initialisation, recompute outline when all - // style/structural changes have been employed: - setTimeout(() => {this.foundation.notchOutline(this.foundation.shouldFloat); }, 0); - } + private attachLabelToInput() { + // if the mdcTextField is a LABEL element wrapping the input OR the floatingLabel is NOT a LABEL element, + // the input gets an aria-labelledby attaching it to the floatingLabel; + // otherwise the floatingLabel gets a 'for' attribute, attaching it to the input: + let first = true; + const needLabeledBy = this.root.nativeElement.nodeName.toLowerCase() === 'label' || !this._floatingLabel?.isLabelElement(); + this._inputs!.forEach(input => { + input._labeledBy = (first && needLabeledBy) ? this._floatingLabel?.id || null : null; + first = false; + }); + first = true; + this._floatingLabels?.forEach(label => { + label.for = (first && !needLabeledBy && this._floatingLabel?.isLabelElement()) ? this._input?.id || null : null; + first = false; + }); + } + + private attachHelperTextToInput() { + let first = true; + this._inputs!.forEach(input => { + const assign = first ? this._helperText?.id || null : null; + input._controls = assign; + input._describedBy = assign; + first = false; + }); + } + + private subscribeInputChanges() { + this.onInputChange$.next(); + this._input?._valueChange.asObservable().pipe(takeUntil(this.onInputChange$)).subscribe((value) => { + this.foundation?.setValue(value!); // value can be null, but null should be accepted by foundation + }); + } + + /** @internal */ + protected getRippleInteractionElement() { + return this._input!._elm; } /** @@ -484,97 +642,84 @@ export class MdcTextFieldDirective extends AbstractMdcRipple implements AfterCon @Input() set valid(value: boolean) { if (value == null) { this._valid = null; // reset to null, validity now managed by the input control. - this.foundation.useCustomValidityChecking_ = false; - this.foundation.changeValidity_(this.mdcAdapter.getNativeInput().validity.valid); + this.foundation?.setUseNativeValidation(true); + // foundation doesn't change style when we switch to native validation; + // trigger possible new style: + this.foundation && (this.foundation)['styleValidity_'](this.mdcAdapter.getNativeInput()?.validity.valid); } else if (value !== this._valid) { this._valid = asBoolean(value); - this.foundation.setValid(this._valid); + this.foundation?.setValid(this._valid); } } - @HostBinding('class.mdc-text-field--textarea') get _textArea(): boolean { - return this._input._isTextarea(); - } + static ngAcceptInputType_valid: boolean | ''; - /** - * When this input is set to a value other than false, the text-field will be styled - * as a box, and the box will get a ripple animation on click. - */ - @HostBinding('class.mdc-text-field--box') @Input() - get box() { - return this._box; - } - - set box(val: any) { - let newVal = asBoolean(val); - if (newVal !== this._box) { - this._box = asBoolean(val); - this.reconstructComponent(); - } + /** @internal */ + @HostBinding('class.mdc-text-field--textarea') get _textArea(): boolean { + return this._input!._isTextarea(); } - /** - * When this input is set to a value other than false, the text-field will be styled - * with a notched outline. - */ - @HostBinding('class.mdc-text-field--outlined') @Input() + /** @internal */ + @HostBinding('class.mdc-text-field--outlined') get outlined() { - return this._outlined; + return !!this._outline; } - set outlined(val: any) { - let newVal = asBoolean(val); - if (newVal !== this._outlined) { - this._outlined = asBoolean(val); - this.reconstructComponent(); - } + /** @internal */ + @HostBinding('class.mdc-text-field--no-label') + get noLabel() { + return !this._floatingLabel; } - @HostBinding('class.mdc-text-field--with-leading-icon') get _leadingIcon(): boolean { - return this._icon && !this._icon._el.nativeElement.previousElementSibling; + /** @internal */ + @HostBinding('class.mdc-text-field--with-leading-icon') get _leading(): boolean { + return !!this._leadingIcon; } - @HostBinding('class.mdc-text-field--with-trailing-icon') get _trailingIcon(): boolean { - return this._icon && this._icon._el.nativeElement.previousElementSibling; - } - - /** - * When this property is defined and does not have value false, the text-field will be styled more - * compact. - */ - @HostBinding('class.mdc-text-field--dense') @Input() - get dense() { - return this._dense; - } - - set dense(val: any) { - let newVal = asBoolean(val); - if (newVal !== this._dense) { - this._dense = asBoolean(val); - this.recomputeOutline(); - } + /** @internal */ + @HostBinding('class.mdc-text-field--with-trailing-icon') get _trailing(): boolean { + return !!this._trailingIcon; } /** * Assign an mdcTextFieldHelperText (exported as mdcHelperText) to this - * input to add a helper-text or validation message to the textfield. See the examples for hints + * input to add a helper-text or validation message to the text-field. See the examples for hints * on how to do this. */ - @Input() get helperText(): MdcTextFieldHelperTextDirective { + @Input() get helperText(): MdcTextFieldHelperTextDirective | null { return this._helperText; } - set helperText(helperText: MdcTextFieldHelperTextDirective) { - if (this._initialized) - throw new Error("Changing the helperText input of an mdcTextField after initialization is not allowed. " + - "Change the content of the mdcTextFieldHelperText instead.") + set helperText(helperText: MdcTextFieldHelperTextDirective | null) { this._helperText = helperText; + this.onHelperTextChange$.next(); } + /** @internal */ @HostBinding('class.mdc-text-field--disabled') get _disabled() { // TODO: this mirrors what the text-field can update itself from adapter.getNativeInput // is there a way to trigger the textfield to re-read that when the disabled state of // the input changes? return this._input ? this._input.disabled : false; } + + private get _input() { + return this._inputs?.first; + } + + private get _floatingLabel() { + return this._floatingLabels?.first; + } + + private get _outline() { + return this._outlines?.first; + } } + +export const TEXT_FIELD_DIRECTIVES = [ + MdcTextFieldInputDirective, + MdcTextFieldIconDirective, + MdcTextFieldHelperLineDirective, + MdcTextFieldHelperTextDirective, + MdcTextFieldDirective +]; diff --git a/bundle/src/components/toolbar/mdc.toolbar.adapter.ts b/bundle/src/components/toolbar/mdc.toolbar.adapter.ts deleted file mode 100644 index 34432d4..0000000 --- a/bundle/src/components/toolbar/mdc.toolbar.adapter.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** @docs-private */ -export interface MdcToolbarAdapter { - hasClass: (className: string) => boolean; - addClass: (className: string) => void; - removeClass: (className: string) => void; - registerScrollHandler: (handler: EventListener) => void; - deregisterScrollHandler: (handler: EventListener) => void; - registerResizeHandler: (handler: EventListener) => void; - deregisterResizeHandler: (handler: EventListener) => void; - getViewportWidth: () => number; - getViewportScrollY: () => number; - getOffsetHeight: () => number; - getFirstRowElementOffsetHeight: () => number; - notifyChange: (evtData: {flexibleExpansionRatio: number}) => void; - setStyle: (property: string, value: number) => void; - setStyleForTitleElement: (property: string, value: number) => void; - setStyleForFlexibleRowElement: (property: string, value: number) => void; - setStyleForFixedAdjustElement: (property: string, value: number) => void; -} diff --git a/bundle/src/components/toolbar/mdc.toolbar.directive.ts b/bundle/src/components/toolbar/mdc.toolbar.directive.ts deleted file mode 100644 index 386453e..0000000 --- a/bundle/src/components/toolbar/mdc.toolbar.directive.ts +++ /dev/null @@ -1,377 +0,0 @@ -import { AfterContentInit, AfterViewInit, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, - HostBinding, HostListener, Input, NgZone, OnDestroy, Optional, Output, Provider, Renderer2, Self, ViewChild, - ViewEncapsulation } from '@angular/core'; -import { NgControl } from '@angular/forms'; -import { MDCToolbar, MDCToolbarFoundation } from '@material/toolbar'; -import { util } from '@material/ripple'; -import { MdcToolbarAdapter } from './mdc.toolbar.adapter'; -import { asBoolean } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; - -/** - * A directive for a toolbar row. The content of a toolbar should always be embedded - * in toolbar rows. So this directive should always be used as a direct child of an - * MdcToolbarDirective. Multiple rows are allowed, which rows are visible - * depends on the style of the toolbar, and the scroll position of the content of - * the page. - */ -@Directive({ - selector: '[mdcToolbarRow]' -}) -export class MdcToolbarRowDirective { - @HostBinding('class.mdc-toolbar__row') _hostClass = true; - - constructor(public _elm: ElementRef) { - } -} - -/** - * A directive for a toolbar section. A toolbar row should always be composed of toolbar sections. - * Thus, this directive should always be used as a direct child of an MdcToolbarRowDirective. - * Multiple sections, with different alignment options, are allowed per row. - */ -@Directive({ - selector: '[mdcToolbarSection]' -}) -export class MdcToolbarSectionDirective { - @HostBinding('class.mdc-toolbar__section') _hostClass = true; - private _alignEnd = false; - private _alignStart = false; - private _shrinkToFit = false; - - /** - * Make the section align to the start of the toolbar row (default alignment is to the - * center). - */ - @Input() @HostBinding('class.mdc-toolbar__section--align-start') get alignStart() { - return this._alignStart; - } - - set alignStart(val: any) { - this._alignStart = asBoolean(val); - } - - /** - * Make the section align to the end of the toolbar row (default alignment is to the - * center). - */ - @Input() @HostBinding('class.mdc-toolbar__section--align-end') get alignEnd() { - return this._alignEnd; - } - - set alignEnd(val: any) { - this._alignEnd = asBoolean(val); - } - - /** - * Toolbar sections are laid out using flexbox. Each section will take up an equal amount - * of space within the toolbar by default. To accomodate very long sections (e.g. a long title), - * set shrinkToFit to a value other than false on the other sections in the row. - */ - @Input() @HostBinding('class.mdc-toolbar__section--shrink-to-fit') get shrinkToFit() { - return this._shrinkToFit; - } - - set shrinkToFit(val: any) { - this._shrinkToFit = asBoolean(val); - } -} - -/** - * This directive adds extra styling to toolbar text that represents the title of the toolbar. - * The directive should be a child of an MdcToolbarSectionDirective. - */ -@Directive({ - selector: '[mdcToolbarTitle]' -}) -export class MdcToolbarTitleDirective { - @HostBinding('class.mdc-toolbar__title') _hostClass = true; - - constructor(public _elm: ElementRef) { - } -} - -/** - * This directive is typically used to style icons placed in the toolbar placed - * on the right hands side. Use MdcToolbarMenuIcon for the 'main' - * icon, usually placed to the left of the menu. - * The directive should be a child of an MdcToolbarSectionDirective. - */ -@Directive({ - selector: '[mdcToolbarIcon]' -}) -export class MdcToolbarIcon { - @HostBinding('class.mdc-toolbar__icon') _hostClass = true; - - constructor(public _elm: ElementRef) { - } -} - -/** - * This directive is typically used to style the main toolbar icon, usually placed to - * the left of the toolbar title. For other icons in the toolbar, use - * MdcToolbarIcon instead. - */ -@Directive({ - selector: '[mdcToolbarMenuIcon]' -}) -export class MdcToolbarMenuIcon { - @HostBinding('class.mdc-toolbar__menu-icon') _hostClass = true; - - constructor(public _elm: ElementRef) { - } -} - -/** - * For fixed toolbars, this directive should be put on the page's - * content wrapper element, and the exported directive should be assigned to the - * fixedAdjust property of the MdcToolbarDirective. - * This will make the toolbar aware of the content wrapper, so that the top marging - * can be adjusted based on the style of the toolbar, and the scroll of the content. - */ -@Directive({ - selector: '[mdcToolbarFixedAdjust]', - exportAs: 'mdcFixedAdjust' -}) -export class MdcToolbarFixedAdjustDirective { - @HostBinding('class.mdc-toolbar-fixed-adjust') _hostClass = true; - - constructor(public _elm: ElementRef) { - } -} - -/** - * A directive for creating toolbars. All content inside a toolbar should be - * embedded inside MdcToolbarRowDirective elements. - */ -@Directive({ - selector: '[mdcToolbar]' -}) -export class MdcToolbarDirective implements AfterViewInit, OnDestroy { - @HostBinding('class.mdc-toolbar') _hostClass = true; - /** - * Assign a MdcToolbarFixedAdjustDirective put on the main - * content of the page. Required for fixed toolbars, - * to properly layout the toolbar and the content when users scroll. - */ - @Input() fixedAdjust: MdcToolbarFixedAdjustDirective; - /** - * A number between [0, 1] that represents the ratio of flexible space - * that has already been collapsed divided by the total amount of flexible space - * for flexible toolbars. - */ - @Output() expansionRatio = new EventEmitter(); - @ContentChild(MdcToolbarTitleDirective) _title; - @ContentChild(MdcToolbarRowDirective) _firstRow; - private _viewport: HTMLElement; - private _initialized = false; - private _fixed = false; - private _waterfall = false; - private _fixedLastRowOnly = false; - private _flexible = false; - private _flexibleDefaultBehavior = false; - - private mdcAdapter: MdcToolbarAdapter = { - hasClass: (className: string) => { - return this.root.nativeElement.classList.contains(className); - }, - addClass: (className: string) => { - this.renderer.addClass(this.root.nativeElement, className); - }, - removeClass: (className: string) => { - this.renderer.removeClass(this.root.nativeElement, className); - }, - registerScrollHandler: (handler: EventListener) => { - if (this._viewport) - this._viewport.addEventListener('scroll', handler); - else - window.addEventListener('scroll', handler); - }, - deregisterScrollHandler: (handler: EventListener) => { - if (this._viewport) - this._viewport.removeEventListener('scroll', handler); - else - window.removeEventListener('scroll', handler); - }, - registerResizeHandler: (handler: EventListener) => { - window.addEventListener('resize', handler); - }, - deregisterResizeHandler: (handler: EventListener) => { - window.removeEventListener('resize', handler); - }, - getViewportWidth: () => this._viewport ? this._viewport.clientWidth : window.innerWidth, - getViewportScrollY: () => this._viewport ? this._viewport.scrollTop : window.pageYOffset, - getOffsetHeight: () => this.root.nativeElement.offsetHeight, - getFirstRowElementOffsetHeight: () => this._firstRow._elm.nativeElement.offsetHeight, - notifyChange: (evtData: {flexibleExpansionRatio: number}) => { - this.expansionRatio.emit(evtData.flexibleExpansionRatio); - }, - setStyle: (property: string, value: number) => { - this.renderer.setStyle(this.root.nativeElement, property, value); - }, - setStyleForTitleElement: (property: string, value: number) => { - if (this._title) - this.renderer.setStyle(this._title._elm.nativeElement, property, value); - }, - setStyleForFlexibleRowElement: (property: string, value: number) => { - this.renderer.setStyle(this._firstRow._elm.nativeElement, property, value); - }, - setStyleForFixedAdjustElement: (property: string, value: number) => { - if (this.fixedAdjust) - this.renderer.setStyle(this.fixedAdjust._elm.nativeElement, property, value); - } - }; - private foundation: { init: Function, destroy: Function } = new MDCToolbarFoundation(this.mdcAdapter); - - constructor(private renderer: Renderer2, private root: ElementRef, private registry: MdcEventRegistry, - private zone: NgZone) { - } - - ngAfterViewInit() { - // Using ngAfterViewInit instead of ngAfterContentInit, because the MDCToolbarFoundation.init - // uses MdcToolbarAdapter.hasClass on classes that we bind in this component. Those classes are only - // available after the view is fully initialized. - // TODO: in other components we just check the property value instead of the class (property based on - // the classname given to the adapter), so that ngAfterContentInit can be used after all. That - // seems a nicer strategy. - this._initialized = true; - this.initFixedScroll(); - this.foundation.init(); - } - - ngOnDestroy() { - this.destroyFixedScroll(); - this.foundation.destroy(); - } - - initFixedScroll() { - if (this._viewport && this._fixed) { - this.zone.runOutsideAngular(() => { - // simulate 'fixed' relative to view position of parent by setting position to - // absolute (MDC sets it to fixed), and updating the vertical position on scroll: - this.root.nativeElement.style.position = 'absolute'; - this._viewport.addEventListener('scroll', this._updateViewPort, util.applyPassive()); - this._viewport.addEventListener('touchmove', this._updateViewPort, util.applyPassive()); - window.addEventListener('resize', this._updateViewPort, util.applyPassive()); - }); - this._updateViewPort(); - } - } - - destroyFixedScroll() { - if (this._viewport && this._fixed) { - this._viewport.removeEventListener('scroll', this._updateViewPort); - this._viewport.removeEventListener('touchmove', this._updateViewPort); - window.removeEventListener('resize', this._updateViewPort); - } - } - - _updateViewPort = () => { - // simulate 'fixed' relative to view position of parent: - this.root.nativeElement.style.top = this._viewport.scrollTop + 'px'; - } - - /** - * If set to a value other than false, the toolbar will be fixed to the top of the - * screen (or viewport). - */ - @Input() @HostBinding('class.mdc-toolbar--fixed') get fixed() { - return this._fixed; - } - - set fixed(val: any) { - let newValue = asBoolean(val); - if (this._initialized && this._fixed !== newValue) - throw new Error('fixed property should not be changed after the mdcToolbar is initialized'); - this._fixed = newValue; - } - - /** - * If set to a value other than false, and used in combination with fixed - * the toolbar will become a waterfall toolbar. - * A waterfall toolbar is initially static and has no elevation, but when content scrolls under it, - * the toolbar becomes fixed and gains elevation. - */ - @Input() @HostBinding('class.mdc-toolbar--waterfall') get waterfall() { - return this._waterfall; - } - - set waterfall(val: any) { - this._waterfall = asBoolean(val); - } - - /** - * If set to a value other than false, fixed toolbars will anchor only the last row to the top. - */ - @Input() @HostBinding('class.mdc-toolbar--fixed-lastrow-only') get fixedLastrowOnly() { - return this._fixedLastRowOnly; - } - - set fixedLastrowOnly(val: any) { - let newValue = asBoolean(val); - if (this._initialized && this._fixedLastRowOnly !== newValue) - throw new Error('fixedLastrowOnly property should not be changed after the mdcToolbar is initialized'); - this._fixedLastRowOnly = newValue; - } - - /** - * A flexible toolbar changes height when the user scrolls. Flexible behavior is highly customizable, - * quoted from the upstream mdc-toolbar documentation: - *
- * We only define the change of flexible space size without making further assumptions. - * But we do recommend the height of flexible space should be an integral number of - * toolbar row height and provide a easier way for user to customize height. - * Users can adjust the height of flexible space through sass variable - * $mdc-toolbar-ratio-to-extend-flexible or css variable - * --mdc-toolbar-ratio-to-extend-flexible. - *
- */ - @Input() @HostBinding('class.mdc-toolbar--flexible') get flexible() { - return this._flexible; - } - - set flexible(val: any) { - let newValue = asBoolean(val); - if (this._initialized && this._flexible !== newValue) - throw new Error('flexible property should not be changed after the mdcToolbar is initialized'); - this._flexible = newValue; - } - - /** - * A default behavior for flexible toolbars. - * For more information see: - * - * Flexible Toolbar documention - * . - */ - @Input() @HostBinding('class.mdc-toolbar--flexible-default-behavior') get flexibleDefaultBehavior() { - return this._flexibleDefaultBehavior; - } - - set flexibleDefaultBehavior(val: any) { - let newValue = asBoolean(val); - if (this._initialized && this._flexibleDefaultBehavior !== newValue) - throw new Error('flexibleDefaultBehavior property should not be changed after the mdcToolbar is initialized'); - this._flexibleDefaultBehavior = newValue; - } - - /** - * Assign any HTMLElement to this property to place a flexible toolbar fixed to that element - * (usually the parent container), instead of to the browser window. This property is mainly added for creating nice - * demos of toolbars embedded inside other pages (such as on this documentation page). It is not recommended to use - * this for a real application toolbar. The position is kept fixed to the container element by listening - * for scroll/resize events, and using javascript to recompute the position. This may influence the smoothness - * of the scrolling experience, especially on mobile devices. - * The viewport element must have css styling: position: relative, and should have a fixed - * height. - */ - @Input() get viewport() { - return this._viewport; - } - - set viewport(elm: HTMLElement) { - if (this._initialized && elm !== this._viewport) - throw new Error('viewport directive should not be changed after the mdcToolbar is initialized'); - this._viewport = elm; - } -} diff --git a/bundle/src/components/top-app-bar/mdc.top-app-bar.adapter.ts b/bundle/src/components/top-app-bar/mdc.top-app-bar.adapter.ts deleted file mode 100644 index 33d9387..0000000 --- a/bundle/src/components/top-app-bar/mdc.top-app-bar.adapter.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** @docs-private */ -export interface MdcTopAppBarAdapter { - hasClass: (className: string) => boolean; - addClass: (className: string) => void; - removeClass: (className: string) => void; - registerNavigationIconInteractionHandler: (type: string, handler: EventListener) => void; - deregisterNavigationIconInteractionHandler: (type: string, handler: EventListener) => void; - notifyNavigationIconClicked: () => void; - registerScrollHandler: (handler: EventListener) => void; - deregisterScrollHandler: (handler: EventListener) => void; - getViewportScrollY: () => number; - getTotalActionItems: () => number; -} diff --git a/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.spec.ts b/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.spec.ts index b90a7c5..50ba86e 100644 --- a/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.spec.ts +++ b/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.spec.ts @@ -1,17 +1,18 @@ -import { TestBed, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Component } from '@angular/core'; +import { ICON_BUTTON_DIRECTIVES } from '../icon-button/mdc.icon-button.directive'; import { TOP_APP_BAR_DIRECTIVES, MdcTopAppBarDirective } from './mdc.top-app-bar.directive'; const template = `
- menu + Title
- {{item.icon}} +
@@ -45,7 +46,7 @@ describe('MdcTopAppBarDirective', () => { function setup(testComponentType: any = TestComponent) { const fixture = TestBed.configureTestingModule({ - declarations: [...TOP_APP_BAR_DIRECTIVES, testComponentType] + declarations: [...ICON_BUTTON_DIRECTIVES, ...TOP_APP_BAR_DIRECTIVES, testComponentType] }).createComponent(testComponentType); fixture.detectChanges(); return { fixture }; @@ -62,8 +63,8 @@ describe('MdcTopAppBarDirective', () => { expect(fixture.nativeElement.querySelector('main').className).toBe('mdc-top-app-bar--fixed-adjust'); const bar = fixture.debugElement.query(By.directive(MdcTopAppBarDirective)).injector.get(MdcTopAppBarDirective); - expect(bar.viewport).toBeUndefined(); - expect(bar.fixedAdjust).toBeDefined(); + expect(bar.viewport).toBeNull() + expect(bar.fixedAdjust).toBe(fixture.nativeElement.querySelector('main')); expect(bar.mdcTopAppBar).toBe('default'); })); @@ -201,11 +202,11 @@ describe('MdcTopAppBarDirective', () => {
- menu + Title
- {{item.icon}} +
@@ -231,7 +232,6 @@ describe('MdcTopAppBarDirective', () => { const header: HTMLElement = fixture.nativeElement.querySelector('header.mdc-top-app-bar'); const viewport = fixture.nativeElement.querySelector('#viewport'); const spans: NodeListOf = fixture.nativeElement.querySelectorAll('main span'); - const testComponent = fixture.debugElement.injector.get(TestViewportComponent); expect(header.classList.contains('mdc-top-app-bar')).toBe(true); expect(header.style.position).toBe('absolute'); expect(header.getBoundingClientRect().width).toBeLessThan(window.innerWidth / 4 * 3); @@ -241,11 +241,4 @@ describe('MdcTopAppBarDirective', () => { fixture.detectChanges(); expect(header.classList.contains('mdc-top-app-bar--short-collapsed')).toBe(true); })); - - it('reassign viewport not allowed', (() => { - const { fixture } = setup(TestViewportComponent); - const bar = fixture.debugElement.query(By.directive(MdcTopAppBarDirective)).injector.get(MdcTopAppBarDirective); - expect(bar.viewport).toBeDefined(); - expect(() => {bar.viewport = bar.viewport.parentElement;}).toThrowError(/.*viewport.*directive.*changed.*/); - })); }); diff --git a/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.ts b/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.ts index c651ae5..bfb4eed 100644 --- a/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.ts +++ b/bundle/src/components/top-app-bar/mdc.top-app-bar.directive.ts @@ -1,11 +1,10 @@ -import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, Input, +import { AfterContentInit, ContentChildren, Directive, ElementRef, HostBinding, Inject, Input, NgZone, OnDestroy, QueryList, Renderer2 } from '@angular/core'; -import { MDCTopAppBarFoundation, MDCFixedTopAppBarFoundation, - MDCShortTopAppBarFoundation } from '@material/top-app-bar'; -import { util } from '@material/ripple'; -import { MdcTopAppBarAdapter } from './mdc.top-app-bar.adapter'; +import { DOCUMENT } from '@angular/common'; +import { MDCTopAppBarAdapter, MDCTopAppBarBaseFoundation, + MDCTopAppBarFoundation, MDCFixedTopAppBarFoundation, MDCShortTopAppBarFoundation } from '@material/top-app-bar'; +import { events } from '@material/dom'; import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; -import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** * A directive for a top-app-bar row. The content of a top-app-bar should always be embedded @@ -17,7 +16,8 @@ import { MdcEventRegistry } from '../../utils/mdc.event.registry'; selector: '[mdcTopAppBarRow]' }) export class MdcTopAppBarRowDirective { - @HostBinding('class.mdc-top-app-bar__row') _hostClass = true; + /** @internal */ + @HostBinding('class.mdc-top-app-bar__row') readonly _cls = true; constructor(public _elm: ElementRef) { } @@ -32,7 +32,8 @@ export class MdcTopAppBarRowDirective { selector: '[mdcTopAppBarSection]' }) export class MdcTopAppBarSectionDirective { - @HostBinding('class.mdc-top-app-bar__section') _hostClass = true; + /** @internal */ + @HostBinding('class.mdc-top-app-bar__section') readonly _cls = true; private _alignEnd = false; private _alignStart = false; @@ -44,10 +45,12 @@ export class MdcTopAppBarSectionDirective { return this._alignStart; } - set alignStart(val: any) { + set alignStart(val: boolean) { this._alignStart = asBoolean(val); } + static ngAcceptInputType_alignStart: boolean | ''; + /** * Make the section align to the end of the toolbar row (default alignment is to the * center). @@ -56,9 +59,11 @@ export class MdcTopAppBarSectionDirective { return this._alignEnd; } - set alignEnd(val: any) { + set alignEnd(val: boolean) { this._alignEnd = asBoolean(val); } + + static ngAcceptInputType_alignEnd: boolean | ''; } /** @@ -69,7 +74,8 @@ export class MdcTopAppBarSectionDirective { selector: '[mdcTopAppBarTitle]' }) export class MdcTopAppBarTitleDirective { - @HostBinding('class.mdc-top-app-bar__title') _hostClass = true; + /** @internal */ + @HostBinding('class.mdc-top-app-bar__title') readonly _cls = true; constructor(public _elm: ElementRef) { } @@ -86,7 +92,8 @@ export class MdcTopAppBarTitleDirective { selector: '[mdcTopAppBarNavIcon]' }) export class MdcTopAppBarNavIconDirective { - @HostBinding('class.mdc-top-app-bar__navigation-icon') _hostClass = true; + /** @internal */ + @HostBinding('class.mdc-top-app-bar__navigation-icon') readonly _cls = true; constructor(public _elm: ElementRef) { } @@ -102,12 +109,13 @@ export class MdcTopAppBarNavIconDirective { selector: '[mdcTopAppBarAction]' }) export class MdcTopAppBarActionDirective { - @HostBinding('class.mdc-top-app-bar__action-item') _hostClass = true; + /** @internal */ + @HostBinding('class.mdc-top-app-bar__action-item') readonly _cls = true; /** * A label for the action item. The value will be applied to both the * aria-label, and alt attribute of the item. */ - @Input() @HostBinding('attr.aria-label') @HostBinding('attr.alt') label: string; + @Input() @HostBinding('attr.aria-label') @HostBinding('attr.alt') label: string | null = null; constructor(public _elm: ElementRef) { } @@ -121,18 +129,34 @@ export class MdcTopAppBarActionDirective { selector: '[mdcTopAppBar]' }) export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { - @HostBinding('class.mdc-top-app-bar') _hostClass = true; - @ContentChildren(MdcTopAppBarActionDirective, {descendants: true}) _actionItems: QueryList; - private _viewport: HTMLElement; - private _fixedAdjust: HTMLElement; - private _initialized = false; + /** @internal */ + @HostBinding('class.mdc-top-app-bar') readonly _cls = true; + private document: Document; + /** @internal */ + @ContentChildren(MdcTopAppBarActionDirective, {descendants: true}) _actionItems?: QueryList; + private handleScroll = () => { + if (this.viewport && (this._type === 'short' || this._type === 'fixed')) + this._updateViewPort(); + this.foundation?.handleTargetScroll(); + } + private handleResize = () => { + if (this.viewport && (this._type === 'short' || this._type === 'fixed')) + this._updateViewPort(); + this.foundation?.handleWindowResize(); + } + private updateViewport = () => { + if (this.viewport && (this._type === 'short' || this._type === 'fixed')) + this._updateViewPort(); + } + private _viewport: HTMLElement | null = null; + private _fixedAdjust: HTMLElement | null = null; private _type: 'short' | 'fixed' | 'default' = 'default'; private _prominent = false; private _dense = false; - private _collapsedOverride: boolean; - private _collapsedState: boolean; + private _collapsedOverride: boolean | null = null; + private _collapsedState: boolean | null = null; - private mdcAdapter: MdcTopAppBarAdapter = { + private mdcAdapter: MDCTopAppBarAdapter = { hasClass: (className: string) => { if (className === 'mdc-top-app-bar--short-collapsed') // the foundation uses this during initialisation to determine whether @@ -156,78 +180,59 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { else this._rndr.removeClass(this._elm.nativeElement, className); }, - registerNavigationIconInteractionHandler: (type: string, handler: EventListener) => {}, - deregisterNavigationIconInteractionHandler: (type: string, handler: EventListener) => {}, - // no need for notifyNavigationIconClicked emitting anything, library consumers can just - // attach an angular click event listener to the navigation icon for the same behavior - notifyNavigationIconClicked: () => {}, - registerScrollHandler: (handler: EventListener) => { - if (this._viewport) - this._registry.listenElm(this._rndr, 'scroll', handler, this._viewport); - else - this._registry.listenElm(this._rndr, 'scroll', handler, window); - }, - deregisterScrollHandler: (handler: EventListener) => { - this._registry.unlisten('scroll', handler); - }, - getViewportScrollY: () => this._viewport ? this._viewport.scrollTop : window.pageYOffset, - getTotalActionItems: () => this._actionItems.length + setStyle: (property, value) => this._rndr.setStyle(this._elm.nativeElement, property, value), + getTopAppBarHeight: () => this._elm.nativeElement.clientHeight, + notifyNavigationIconClicked: () => {}, // not a special event in our implementation + getViewportScrollY: () => this._viewport ? this._viewport.scrollTop : this.document.defaultView!.pageYOffset, + getTotalActionItems: () => this._actionItems!.length }; - private foundation: { init: Function, destroy: Function, isCollapsed: boolean }; + private foundation: MDCTopAppBarBaseFoundation | null = null; - constructor(private _rndr: Renderer2, private _elm: ElementRef, private _registry: MdcEventRegistry, - private zone: NgZone) { + constructor(private _rndr: Renderer2, private _elm: ElementRef, private zone: NgZone, @Inject(DOCUMENT) doc: any) { + this.document = doc as Document; } ngAfterContentInit() { - if (this._viewport) - this._elm.nativeElement.style.position = 'absolute'; - this._initialized = true; this.foundationReInit(); } ngOnDestroy() { this.removeScrollListeners(); - this.foundation.destroy(); + this.foundation?.destroy(); this.foundation = null; - this._initialized = false; } private foundationReInit() { - if (this._initialized) { - if (this.foundation) - this.foundation.destroy(); - - // undow viewport init specific for a foundation implementation: - this.removeScrollListeners(); - this._elm.nativeElement.style.top = null; - - // remove classes set by foundations, if we reinitialize/switch foundation: - this._rndr.removeClass(this._elm.nativeElement, 'mdc-top-app-bar--fixed-scrolled'); - - this.initFixedAdjust(); + if (this.foundation) + this.foundation.destroy(); - // first check short, because a short bar is also more or less fixed: - if (this._type === 'short') - this.foundation = new MDCShortTopAppBarFoundation(this.mdcAdapter); - else if (this._type === 'fixed') - this.foundation = new MDCFixedTopAppBarFoundation(this.mdcAdapter); - else - this.foundation = new MDCTopAppBarFoundation(this.mdcAdapter); - if (this.viewport && (this._type === 'short' || this._type === 'fixed')) { - this.zone.runOutsideAngular(() => { - this._viewport.addEventListener('scroll', this._updateViewPort, util.applyPassive()); - this._viewport.addEventListener('touchmove', this._updateViewPort, util.applyPassive()); - window.addEventListener('resize', this._updateViewPort, util.applyPassive()); - }); - this._updateViewPort(); - } - this.foundation.init(); - } + // undo viewport init specific for a foundation implementation: + this.removeScrollListeners(); + this._elm.nativeElement.style.top = null; + + // remove classes set by foundations, if we reinitialize/switch foundation: + this._rndr.removeClass(this._elm.nativeElement, 'mdc-top-app-bar--fixed-scrolled'); + + if (this._type === 'short') + this.foundation = new MDCShortTopAppBarFoundation(this.mdcAdapter); + else if (this._type === 'fixed') + this.foundation = new MDCFixedTopAppBarFoundation(this.mdcAdapter); + else + this.foundation = new MDCTopAppBarFoundation(this.mdcAdapter); + this.initFixedAdjust(); + + this.zone.runOutsideAngular(() => { + (this._viewport || this.document.defaultView!).addEventListener('scroll', this.handleScroll, events.applyPassive()); + (this._viewport || this.document.defaultView!).addEventListener('touchmove', this.updateViewport, events.applyPassive()); + this.document.defaultView!.addEventListener('resize', this.handleResize, events.applyPassive()); + }); + if (this.viewport && (this._type === 'short' || this._type === 'fixed')) + this._updateViewPort(); + this.foundation.init(); } private initFixedAdjust() { - if (this._initialized && this._fixedAdjust) { + if (this.foundation && this._fixedAdjust) { this._rndr.removeClass(this._fixedAdjust, 'mdc-top-app-bar--fixed-adjust'); this._rndr.removeClass(this._fixedAdjust, 'mdc-top-app-bar--dense-fixed-adjust'); this._rndr.removeClass(this._fixedAdjust, 'mdc-top-app-bar--short-fixed-adjust'); @@ -248,15 +253,13 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { } private removeScrollListeners() { - if (this._viewport) { - this._viewport.removeEventListener('scroll', this._updateViewPort); - this._viewport.removeEventListener('touchmove', this._updateViewPort); - window.removeEventListener('resize', this._updateViewPort); - } + (this._viewport || this.document.defaultView!).removeEventListener('scroll', this.handleScroll, events.applyPassive()); + (this._viewport || this.document.defaultView!).removeEventListener('touchmove', this.updateViewport, events.applyPassive()); + this.document.defaultView!.removeEventListener('resize', this.handleResize, events.applyPassive()); } /** - * The top-app-bar can heva different styles. Set this property to fixed + * The top-app-bar can have different styles. Set this property to fixed * for a top-app-bar fixed to the top of the screen or viewport. * Set to short for a top-app-bar that will collapse to the navigation * icon side when scrolled. @@ -271,10 +274,13 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { val = 'default'; if (val !== this._type) { this._type = val; - this.foundationReInit(); + if (this.foundation) + this.foundationReInit(); } } + static ngAcceptInputType_mdcTopAppBar: 'short' | 'fixed' | 'default' | ''; + /** * If set to a value other than false, the top-app-bar will be styled as a taller * bar. @@ -283,7 +289,7 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { return this._prominent; } - set prominent(val: any) { + set prominent(val: boolean) { let newValue = asBoolean(val); if (newValue !== this._prominent) { this._prominent = asBoolean(val); @@ -291,6 +297,8 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { } } + static ngAcceptInputType_prominent: boolean | ''; + /** * If set to a value other than false, the top-app-bar will be styled a bit more * compact. @@ -299,13 +307,15 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { return this._dense; } - set dense(val: any) { + set dense(val: boolean) { let newValue = asBoolean(val); if (newValue !== this._dense) { this._dense = asBoolean(val); this.initFixedAdjust(); } } + + static ngAcceptInputType_dense: boolean | ''; /** * Set this property to true or false to force the collapsed/uncollapsed state of a short @@ -320,10 +330,12 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { return this._collapsedOverride == null ? !!this._collapsedState : this._collapsedOverride; } - set collapsed(val: any) { + set collapsed(val: boolean) { this._collapsedOverride = asBooleanOrNull(val); } + static ngAcceptInputType_collapsed: boolean | ''; + /** * Top-app-bars are positioned over the rest of their viewport. This means that * some of the content will be hidden under the bar, unless the position of that @@ -336,7 +348,7 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { return this._fixedAdjust; } - set fixedAdjust(el: HTMLElement) { + set fixedAdjust(el: HTMLElement | null) { if (this._fixedAdjust !== el) { this._fixedAdjust = el; this.initFixedAdjust(); @@ -357,28 +369,40 @@ export class MdcTopAppBarDirective implements AfterContentInit, OnDestroy { return this._viewport; } - set viewport(elm: HTMLElement) { - if (this._initialized && elm !== this._viewport) - throw new Error('viewport directive should not be changed after the mdcToolbar is initialized'); - this._viewport = elm; + set viewport(elm: HTMLElement | null) { + if (this._viewport !== elm) { + this.removeScrollListeners(); + this._viewport = elm; + if (this.foundation) + this.foundationReInit(); + } } + /** @internal */ @HostBinding('class.mdc-top-app-bar--short-has-action-item') get _hasActionItems() { - return this._type === 'short' && this._actionItems.length > 0; + return this._type === 'short' && this._actionItems!.length > 0; } + /** @internal */ _updateViewPort = () => { // simulate 'fixed' relative to view position of parent: - this._elm.nativeElement.style.top = this._viewport.scrollTop + 'px'; + this._elm.nativeElement.style.top = this._viewport!.scrollTop + 'px'; } + /** @internal */ @HostBinding('class.mdc-top-app-bar--fixed') get _fixed() { return this._type === 'fixed'; } + /** @internal */ @HostBinding('class.mdc-top-app-bar--short') get _short() { return this._type === 'short'; } + + /** @internal */ + @HostBinding('style.position') get _position() { + return this._viewport ? 'absolute' : null; + } } export const TOP_APP_BAR_DIRECTIVES = [ diff --git a/bundle/src/components/utility/mdc.scrollbar-resize.directive.ts b/bundle/src/components/utility/mdc.scrollbar-resize.directive.ts index 41261af..fa38784 100644 --- a/bundle/src/components/utility/mdc.scrollbar-resize.directive.ts +++ b/bundle/src/components/utility/mdc.scrollbar-resize.directive.ts @@ -1,10 +1,11 @@ -import { Directive, Input, OnDestroy } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Directive, Inject, Input, OnDestroy } from '@angular/core'; import { asBoolean } from '../../utils/value.utils'; -let scrollbarResizeListenerId: string; +let scrollbarResizeListenerId: string | null = null; let scrollbarResizeDirectives = 0; -function initScrollbarResizeListener() { +function initScrollbarResizeListener(document: Document) { if (scrollbarResizeListenerId) return; // create an invisible iframe, covering the full width of the window: @@ -14,10 +15,10 @@ function initScrollbarResizeListener() { // make the iframe contentWindow listen to resize events (they will be triggered when the container adds or removes a // vertical scrollbar, since it changes the width): iframe.onload = function() { - iframe.contentWindow.addEventListener('resize', function() { + iframe.contentWindow!.addEventListener('resize', function() { try { - let evt = new UIEvent('resize', {view: window, cancelable: false, bubbles: true}); - window.dispatchEvent(evt); + let evt = new UIEvent('resize', {view: document.defaultView!, cancelable: false, bubbles: true}); + document.defaultView!.dispatchEvent(evt); } catch(e) {} }); }; @@ -25,11 +26,11 @@ function initScrollbarResizeListener() { document.body.appendChild(iframe); } -function destroyScrollbarResizeListener() { +function destroyScrollbarResizeListener(document: Document) { if (scrollbarResizeListenerId != null) { let iframe = document.getElementById(scrollbarResizeListenerId); if (iframe) - iframe.parentElement.removeChild(iframe); + iframe.parentElement!.removeChild(iframe); scrollbarResizeListenerId = null; } } @@ -53,9 +54,11 @@ function destroyScrollbarResizeListener() { selector: '[mdcScrollbarResize]' }) export class MdcScrollbarResizeDirective implements OnDestroy { + private document: Document; private _scrollbarResize = false; - constructor() { + constructor(@Inject(DOCUMENT) doc: any) { + this.document = doc as Document; } ngOnDestroy() { @@ -63,31 +66,33 @@ export class MdcScrollbarResizeDirective implements OnDestroy { this._scrollbarResize = false; --scrollbarResizeDirectives; if (scrollbarResizeDirectives <= 0) - destroyScrollbarResizeListener(); + destroyScrollbarResizeListener(this.document); } } /** * Set to false to disable triggering resize events because of addition/deletion of a scrollbar. - * The mdcScrollbarResize behavior is removed after all&ngsp; + * The mdcScrollbarResize behavior is removed after all  * mdcScrollbarResize directives on the page are removed or have the value false. */ @Input() get mdcScrollbarResize() { return this._scrollbarResize; } - set mdcScrollbarResize(val: any) { + set mdcScrollbarResize(val: boolean) { let newValue = asBoolean(val); if (newValue !== this._scrollbarResize) { this._scrollbarResize = newValue; if (newValue) { ++scrollbarResizeDirectives; - initScrollbarResizeListener(); + initScrollbarResizeListener(this.document); } else { --scrollbarResizeDirectives; if (scrollbarResizeDirectives <= 0) - destroyScrollbarResizeListener(); + destroyScrollbarResizeListener(this.document); } } } + + static ngAcceptInputType_mdcScrollbarResize: boolean | ''; } diff --git a/bundle/src/components/utility/mdc.standin.ts b/bundle/src/components/utility/mdc.standin.ts index 805f4a7..42f1bb8 100644 --- a/bundle/src/components/utility/mdc.standin.ts +++ b/bundle/src/components/utility/mdc.standin.ts @@ -13,8 +13,8 @@ export interface ElementProvider { */ export abstract class MdcStandIn { private _initialized = false; - private _standIn: ElementRef; - private _actor: T; + private _standIn: ElementRef | null = null; + private _actor: T | null = null; /** * @param elements The query-list for actor components, that require a standin ElementRef if the list is empty. diff --git a/bundle/src/components/utility/router.active.detector.ts b/bundle/src/components/utility/router.active.detector.ts index 4133f4e..b7ed42f 100644 --- a/bundle/src/components/utility/router.active.detector.ts +++ b/bundle/src/components/utility/router.active.detector.ts @@ -23,19 +23,20 @@ export class RouterActiveDetector { }); } - /** @docs-private */ + /** @internal */ init(): void { this.links.changes.subscribe(_ => this.update()); this.linksWithHrefs.changes.subscribe(_ => this.update()); this.update(); } - /** @docs-private */ + /** @internal */ destroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } + /** @internal */ public update(): void { if (!this.links || !this.linksWithHrefs || !this.router.navigated) return; Promise.resolve().then(() => { diff --git a/bundle/src/material.module.ts b/bundle/src/material.module.ts index 7c029cb..d05b012 100644 --- a/bundle/src/material.module.ts +++ b/bundle/src/material.module.ts @@ -1,80 +1,38 @@ export * from './components/button/mdc.button.directive'; -export { MdcCardDirective, - MdcCardMediaDirective, - MdcCardMediaContentDirective, - MdcCardActionButtonsDirective, - MdcCardActionIconsDirective, - MdcCardActionsDirective, - MdcCardPrimaryActionDirective } from './components/card/mdc.card.directive'; -export { MdcCheckboxDirective, - MdcCheckboxInputDirective } from './components/checkbox/mdc.checkbox.directive'; +export * from './components/card/mdc.card.directive'; +export * from './components/checkbox/mdc.checkbox.directive'; export * from './components/chips/mdc.chip.directive'; export * from './components/dialog/mdc.dialog.directive'; -export { MdcDrawerDirective, - MdcDrawerContainerDirective, - MdcDrawerToolbarSpacerDirective, - MdcDrawerHeaderDirective, - MdcDrawerHeaderContentDirective, - MdcDrawerContentDirective } from './components/drawer/mdc.drawer.directive'; -export { MdcElevationDirective } from './components/elevation/mdc.elevation.directive'; +export * from './components/drawer/mdc.drawer.directive'; +export * from './components/elevation/mdc.elevation.directive'; export * from './components/fab/mdc.fab.directive'; -export { MdcFloatingLabelDirective } from './components/floating-label/mdc.floating-label.directive'; +export * from './components/floating-label/mdc.floating-label.directive'; export * from './components/focus-trap/abstract.mdc.focus-trap'; export * from './components/focus-trap/mdc.focus-trap.directive'; -export { MdcFormFieldDirective, - MdcFormFieldInputDirective, - MdcFormFieldLabelDirective } from './components/form-field/mdc.form-field.directive'; +export * from './components/form-field/mdc.form-field.directive'; export * from './components/icon-button/mdc.icon-button.directive'; -export { MdcIconToggleDirective, - MdcIconToggleIconDirective, - MdcFormsIconToggleDirective } from './components/icon-toggle/mdc.icon-toggle.directive'; -export { MdcLinearProgressDirective } from './components/linear-progress/mdc.linear-progress.directive'; -export { MdcListDividerDirective, - MdcListItemDirective, - MdcListItemTextDirective, - MdcListItemSecondaryTextDirective, - MdcListItemGraphicDirective, - MdcListItemMetaDirective, - MdcListDirective, - MdcListGroupSubHeaderDirective, - MdcListGroupDirective } from './components/list/mdc.list.directive'; -export { MdcMenuAnchorDirective, MdcMenuDirective } from './components/menu/mdc.menu.directive'; -export { MdcRadioDirective, - MdcRadioInputDirective } from './components/radio/mdc.radio.directive'; +export * from './components/linear-progress/mdc.linear-progress.directive'; +export * from './components/list/mdc.list.directive'; +export * from './components/menu/mdc.menu.directive'; +export * from './components/menu-surface/mdc.menu-surface.directive'; +export * from './components/notched-outline/mdc.notched-outline.directive'; +export * from './components/radio/mdc.radio.directive'; export * from './components/ripple/abstract.mdc.ripple'; -export { MdcRippleDirective } from './components/ripple/mdc.ripple.directive'; -export { MdcSelectDirective, MdcSelectControlDirective } from './components/select/mdc.select.directive'; -export { MdcSliderDirective, - MdcFormsSliderDirective } from './components/slider/mdc.slider.directive'; -export { MdcSnackbarMessage } from './components/snackbar/mdc.snackbar.message'; -export { MdcSnackbarService } from './components/snackbar/mdc.snackbar.service'; -export { MdcSwitchInputDirective, - MdcSwitchDirective } from './components/switch/mdc.switch.directive'; -export { AbstractMdcTabDirective, MdcTabDirective, - MdcTabIconDirective, - MdcTabIconTextDirective, - MdcTabChange } from './components/tabs/mdc.tab.directive'; -export { MdcTabRouterDirective } from './components/tabs/mdc.tab.router.directive'; -export { MdcTabBarDirective } from './components/tabs/mdc.tab.bar.directive'; -export { MdcTabBarScrollerDirective, - MdcTabBarScrollerInnerDirective, - MdcTabBarScrollerBackDirective, - MdcTabBarScrollerForwardDirective, - MdcTabBarScrollerFrameDirective } from './components/tabs/mdc.tab.bar.scroller.directive'; -export { MdcTextFieldDirective, - MdcTextFieldInputDirective, - MdcTextFieldIconDirective, - MdcTextFieldHelperTextDirective } from './components/text-field/mdc.text-field.directive'; -export { MdcToolbarDirective, - MdcToolbarRowDirective, - MdcToolbarSectionDirective, - MdcToolbarTitleDirective, - MdcToolbarIcon, - MdcToolbarMenuIcon, - MdcToolbarFixedAdjustDirective } from './components/toolbar/mdc.toolbar.directive'; +export * from './components/ripple/mdc.ripple.directive'; +export * from './components/select/mdc.select.directive'; +export * from './components/slider/mdc.slider.directive'; +export * from './components/snackbar/mdc.snackbar.message'; +export * from './components/snackbar/mdc.snackbar.service'; +export * from './components/switch/mdc.switch.directive'; +export * from './components/tab/mdc.tab.bar.directive'; +export * from './components/tab/mdc.tab.directive'; +export * from './components/tab/mdc.tab.indicator.directive'; +export * from './components/tab/mdc.tab.router.directive'; +export * from './components/tab/mdc.tab.scroller.directive'; +export * from './components/text-field/mdc.text-field.directive'; export * from './components/top-app-bar/mdc.top-app-bar.directive'; -export { MdcScrollbarResizeDirective } from './components/utility/mdc.scrollbar-resize.directive'; -export { MdcEventRegistry } from './utils/mdc.event.registry'; +export * from './components/utility/mdc.scrollbar-resize.directive'; +export * from './utils/mdc.event.registry'; // MaterialModule needs to be defined in its own source file to prevent circular dependencies // with rollup export { MaterialModule } from './material.ng.module'; diff --git a/bundle/src/material.ng.module.ts b/bundle/src/material.ng.module.ts index 8bf5e1d..c0a7a09 100644 --- a/bundle/src/material.ng.module.ts +++ b/bundle/src/material.ng.module.ts @@ -1,74 +1,33 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { MdcButtonDirective, MdcButtonIconDirective } from './components/button/mdc.button.directive'; -import { MdcCardDirective, - MdcCardMediaDirective, - MdcCardMediaContentDirective, - MdcCardActionButtonsDirective, - MdcCardActionIconsDirective, - MdcCardActionsDirective, - MdcCardPrimaryActionDirective } from './components/card/mdc.card.directive'; -import { MdcCheckboxDirective, - MdcCheckboxInputDirective } from './components/checkbox/mdc.checkbox.directive'; +import { BUTTON_DIRECTIVES } from './components/button/mdc.button.directive'; +import { CARD_DIRECTIVES } from './components/card/mdc.card.directive'; +import { CHECKBOX_DIRECTIVES } from './components/checkbox/mdc.checkbox.directive'; import { CHIP_DIRECTIVES } from './components/chips/mdc.chip.directive'; import { DIALOG_DIRECTIVES } from './components/dialog/mdc.dialog.directive'; -import { MdcDrawerDirective, - MdcDrawerContainerDirective, - MdcDrawerToolbarSpacerDirective, - MdcDrawerHeaderDirective, - MdcDrawerHeaderContentDirective, - MdcDrawerContentDirective } from './components/drawer/mdc.drawer.directive'; +import { DRAWER_DIRECTIVES } from './components/drawer/mdc.drawer.directive'; import { MdcElevationDirective } from './components/elevation/mdc.elevation.directive'; import { FAB_DIRECTIVES } from './components/fab/mdc.fab.directive'; import { MdcFloatingLabelDirective } from './components/floating-label/mdc.floating-label.directive'; import { FOCUS_TRAP_DIRECTIVES } from './components/focus-trap/mdc.focus-trap.directive'; -import { MdcFormFieldDirective, - MdcFormFieldInputDirective, - MdcFormFieldLabelDirective } from './components/form-field/mdc.form-field.directive'; +import { FORM_FIELD_DIRECTIVES } from './components/form-field/mdc.form-field.directive'; import { ICON_BUTTON_DIRECTIVES } from './components/icon-button/mdc.icon-button.directive'; -import { MdcIconToggleDirective, - MdcIconToggleIconDirective, - MdcFormsIconToggleDirective } from './components/icon-toggle/mdc.icon-toggle.directive'; -import { MdcLinearProgressDirective } from './components/linear-progress/mdc.linear-progress.directive'; -import { MdcListDividerDirective, - MdcListItemDirective, - MdcListItemTextDirective, - MdcListItemSecondaryTextDirective, - MdcListItemGraphicDirective, - MdcListItemMetaDirective, - MdcListDirective, - MdcListGroupSubHeaderDirective, - MdcListGroupDirective } from './components/list/mdc.list.directive'; -import { MdcMenuAnchorDirective, MdcMenuDirective } from './components/menu/mdc.menu.directive'; -import { MdcRadioDirective, - MdcRadioInputDirective } from './components/radio/mdc.radio.directive'; +import { LINEAR_PROGRESS_DIRECTIVES } from './components/linear-progress/mdc.linear-progress.directive'; +import { LIST_DIRECTIVES } from './components/list/mdc.list.directive'; +import { MENU_DIRECTIVES } from './components/menu/mdc.menu.directive'; +import { MENU_SURFACE_DIRECTIVES } from './components/menu-surface/mdc.menu-surface.directive'; +import { NOTCHED_OUTLINE_DIRECTIVES } from './components/notched-outline/mdc.notched-outline.directive'; +import { RADIO_DIRECTIVES } from './components/radio/mdc.radio.directive'; import { MdcRippleDirective } from './components/ripple/mdc.ripple.directive'; -import { MdcSelectDirective, MdcSelectControlDirective } from './components/select/mdc.select.directive'; -import { MdcSliderDirective, - MdcFormsSliderDirective } from './components/slider/mdc.slider.directive'; -import { MdcSwitchInputDirective, - MdcSwitchDirective } from './components/switch/mdc.switch.directive'; -import { MdcTabDirective, - MdcTabIconDirective, - MdcTabIconTextDirective } from './components/tabs/mdc.tab.directive'; -import { MdcTabRouterDirective } from './components/tabs/mdc.tab.router.directive'; -import { MdcTabBarDirective } from './components/tabs/mdc.tab.bar.directive'; -import { MdcTabBarScrollerDirective, - MdcTabBarScrollerInnerDirective, - MdcTabBarScrollerBackDirective, - MdcTabBarScrollerForwardDirective, - MdcTabBarScrollerFrameDirective } from './components/tabs/mdc.tab.bar.scroller.directive'; -import { MdcTextFieldDirective, - MdcTextFieldInputDirective, - MdcTextFieldIconDirective, - MdcTextFieldHelperTextDirective } from './components/text-field/mdc.text-field.directive'; -import { MdcToolbarDirective, - MdcToolbarRowDirective, - MdcToolbarSectionDirective, - MdcToolbarTitleDirective, - MdcToolbarIcon, - MdcToolbarMenuIcon, - MdcToolbarFixedAdjustDirective } from './components/toolbar/mdc.toolbar.directive'; +import { SELECT_DIRECTIVES } from './components/select/mdc.select.directive'; +import { SLIDER_DIRECTIVES } from './components/slider/mdc.slider.directive'; +import { SWITCH_DIRECTIVES } from './components/switch/mdc.switch.directive'; +import { TAB_BAR_DIRECTIVES } from './components/tab/mdc.tab.bar.directive'; +import { TAB_DIRECTIVES } from './components/tab/mdc.tab.directive'; +import { TAB_INDICATOR_DIRECTIVES } from './components/tab/mdc.tab.indicator.directive'; +import { TAB_ROUTER_DIRECTIVES } from './components/tab/mdc.tab.router.directive'; +import { TAB_SCROLLER_DIRECTIVES } from './components/tab/mdc.tab.scroller.directive'; +import { TEXT_FIELD_DIRECTIVES } from './components/text-field/mdc.text-field.directive'; import { TOP_APP_BAR_DIRECTIVES } from './components/top-app-bar/mdc.top-app-bar.directive'; import { MdcScrollbarResizeDirective } from './components/utility/mdc.scrollbar-resize.directive'; @@ -77,68 +36,66 @@ import { MdcScrollbarResizeDirective } from './components/utility/mdc.scrollbar- CommonModule ], declarations: [ - MdcButtonDirective, MdcButtonIconDirective, - MdcCardDirective, MdcCardMediaDirective, MdcCardMediaContentDirective, - MdcCardActionButtonsDirective, MdcCardActionIconsDirective, MdcCardActionsDirective, MdcCardPrimaryActionDirective, - MdcCheckboxDirective, MdcCheckboxInputDirective, + ...BUTTON_DIRECTIVES, + ...CARD_DIRECTIVES, + ...CHECKBOX_DIRECTIVES, ...CHIP_DIRECTIVES, ...DIALOG_DIRECTIVES, - MdcDrawerDirective, MdcDrawerContainerDirective, MdcDrawerToolbarSpacerDirective, MdcDrawerHeaderDirective, MdcDrawerHeaderContentDirective, MdcDrawerContentDirective, + ...DRAWER_DIRECTIVES, MdcElevationDirective, ...FAB_DIRECTIVES, MdcFloatingLabelDirective, ...FOCUS_TRAP_DIRECTIVES, - MdcFormFieldDirective, MdcFormFieldInputDirective, MdcFormFieldLabelDirective, + ...FORM_FIELD_DIRECTIVES, ...ICON_BUTTON_DIRECTIVES, - MdcIconToggleDirective, MdcIconToggleIconDirective, MdcFormsIconToggleDirective, - MdcLinearProgressDirective, - MdcListDividerDirective, MdcListItemDirective, MdcListItemTextDirective, MdcListItemSecondaryTextDirective, - MdcListItemGraphicDirective, MdcListItemMetaDirective, MdcListDirective, MdcListGroupSubHeaderDirective, MdcListGroupDirective, - MdcMenuAnchorDirective, MdcMenuDirective, - MdcRadioDirective, MdcRadioInputDirective, + ...LINEAR_PROGRESS_DIRECTIVES, + ...LIST_DIRECTIVES, + ...MENU_DIRECTIVES, + ...MENU_SURFACE_DIRECTIVES, + ...NOTCHED_OUTLINE_DIRECTIVES, + ...RADIO_DIRECTIVES, MdcRippleDirective, - MdcSelectDirective, MdcSelectControlDirective, - MdcSliderDirective, MdcFormsSliderDirective, - MdcSwitchInputDirective, MdcSwitchDirective, - MdcTabDirective, MdcTabIconDirective, MdcTabIconTextDirective, - MdcTabRouterDirective, - MdcTabBarDirective, - MdcTabBarScrollerDirective, MdcTabBarScrollerInnerDirective, MdcTabBarScrollerBackDirective, MdcTabBarScrollerForwardDirective, MdcTabBarScrollerFrameDirective, - MdcTextFieldDirective, MdcTextFieldInputDirective, MdcTextFieldIconDirective, MdcTextFieldHelperTextDirective, - MdcToolbarDirective, MdcToolbarRowDirective, MdcToolbarSectionDirective, MdcToolbarTitleDirective, MdcToolbarIcon, MdcToolbarMenuIcon, MdcToolbarFixedAdjustDirective, + ...SELECT_DIRECTIVES, + ...SLIDER_DIRECTIVES, + ...SWITCH_DIRECTIVES, + ...TAB_BAR_DIRECTIVES, + ...TAB_DIRECTIVES, + ...TAB_INDICATOR_DIRECTIVES, + ...TAB_ROUTER_DIRECTIVES, + ...TAB_SCROLLER_DIRECTIVES, + ...TEXT_FIELD_DIRECTIVES, TOP_APP_BAR_DIRECTIVES, MdcScrollbarResizeDirective ], exports: [ - MdcButtonDirective, MdcButtonIconDirective, - MdcCardDirective, MdcCardMediaDirective, MdcCardMediaContentDirective, - MdcCardActionButtonsDirective, MdcCardActionIconsDirective, MdcCardActionsDirective, MdcCardPrimaryActionDirective, - MdcCheckboxDirective, MdcCheckboxInputDirective, + ...BUTTON_DIRECTIVES, + ...CARD_DIRECTIVES, + ...CHECKBOX_DIRECTIVES, ...CHIP_DIRECTIVES, ...DIALOG_DIRECTIVES, - MdcDrawerDirective, MdcDrawerContainerDirective, MdcDrawerToolbarSpacerDirective, MdcDrawerHeaderDirective, MdcDrawerHeaderContentDirective, MdcDrawerContentDirective, + ...DRAWER_DIRECTIVES, MdcElevationDirective, ...FAB_DIRECTIVES, MdcFloatingLabelDirective, ...FOCUS_TRAP_DIRECTIVES, - MdcFormFieldDirective, MdcFormFieldInputDirective, MdcFormFieldLabelDirective, + ...FORM_FIELD_DIRECTIVES, ...ICON_BUTTON_DIRECTIVES, - MdcIconToggleDirective, MdcIconToggleIconDirective, MdcFormsIconToggleDirective, - MdcLinearProgressDirective, - MdcListDividerDirective, MdcListItemDirective, MdcListItemTextDirective, MdcListItemSecondaryTextDirective, - MdcListItemGraphicDirective, MdcListItemMetaDirective, MdcListDirective, MdcListGroupSubHeaderDirective, MdcListGroupDirective, - MdcMenuAnchorDirective, MdcMenuDirective, - MdcRadioDirective, MdcRadioInputDirective, + ...LINEAR_PROGRESS_DIRECTIVES, + ...LIST_DIRECTIVES, + ...MENU_DIRECTIVES, + ...MENU_SURFACE_DIRECTIVES, + ...NOTCHED_OUTLINE_DIRECTIVES, + ...RADIO_DIRECTIVES, MdcRippleDirective, - MdcSelectDirective, MdcSelectControlDirective, - MdcSliderDirective, MdcFormsSliderDirective, - MdcSwitchInputDirective, MdcSwitchDirective, - MdcTabDirective, MdcTabIconDirective, MdcTabIconTextDirective, - MdcTabRouterDirective, - MdcTabBarDirective, - MdcTabBarScrollerDirective, MdcTabBarScrollerInnerDirective, MdcTabBarScrollerBackDirective, MdcTabBarScrollerForwardDirective, MdcTabBarScrollerFrameDirective, - MdcTextFieldDirective, MdcTextFieldInputDirective, MdcTextFieldIconDirective, MdcTextFieldHelperTextDirective, - MdcToolbarDirective, MdcToolbarRowDirective, MdcToolbarSectionDirective, MdcToolbarTitleDirective, MdcToolbarIcon, MdcToolbarMenuIcon, MdcToolbarFixedAdjustDirective, + ...SELECT_DIRECTIVES, + ...SLIDER_DIRECTIVES, + ...SWITCH_DIRECTIVES, + ...TAB_BAR_DIRECTIVES, + ...TAB_DIRECTIVES, + ...TAB_INDICATOR_DIRECTIVES, + ...TAB_ROUTER_DIRECTIVES, + ...TAB_SCROLLER_DIRECTIVES, + ...TEXT_FIELD_DIRECTIVES, TOP_APP_BAR_DIRECTIVES, MdcScrollbarResizeDirective ] diff --git a/bundle/src/test.ts b/bundle/src/test.ts index 18eed69..1be3cfc 100644 --- a/bundle/src/test.ts +++ b/bundle/src/test.ts @@ -20,11 +20,13 @@ getTestBed().initTestEnvironment( // by including all sources here (including non spec.ts files, we'll get // proper 0% coverage reports for sources not included in any test): const testContext = (require).context('.', true, /\.ts/); +//const testContext = (require).context('.', true, /\.(button|checkbox|chip|dialog|drawer|elevation|fab|focus-trap|form-field|icon-button|linear-progress|list|menu|menu-surface|radio|ripple|select|slider|switch|text-field|top-app-bar)\.directive\.spec\.ts/); +//const testContext = (require).context('.', true, /\.(focus-trap)\.directive\.spec\.ts/); testContext.keys().forEach(testContext); function addStyleSheet(href: string) { let link = document.createElement('link'); link.setAttribute('rel', 'stylesheet'); link.setAttribute('href', href); - document.querySelector('head').appendChild(link); + document.querySelector('head')!.appendChild(link); } \ No newline at end of file diff --git a/bundle/src/testutils/page.test.ts b/bundle/src/testutils/page.test.ts index 0b0d8d3..615fbe0 100644 --- a/bundle/src/testutils/page.test.ts +++ b/bundle/src/testutils/page.test.ts @@ -1,4 +1,6 @@ import { ComponentFixture, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Type } from '@angular/core'; export function booleanAttributeVerify( setValue: (value: any) => void, @@ -22,10 +24,11 @@ export function booleanAttributeStyleTest( directive: any, componentProperty: string, directiveProperty: string, - directiveStyle: string) { + directiveStyle: string, + sync: () => void = () => {}) { // test various ways to set the property value: booleanAttributeVerify( - (value) => {component[componentProperty] = value; fixture.detectChanges(); }, + (value) => {component[componentProperty] = value; fixture.detectChanges(); sync(); }, (expected) => { expect(directive[directiveProperty]).toBe(expected, directiveProperty); expect(directive._elm.nativeElement.classList.contains(directiveStyle)).toBe(expected, directiveStyle); @@ -33,6 +36,17 @@ export function booleanAttributeStyleTest( ) } +export function testStyle(fixture: ComponentFixture, property: string, dirProperty: string, style: string, + type: Type, testComponentType: Type, sync: () => void = () => {}) { + const element = fixture.debugElement.query(By.directive(type)).injector.get(type); + const testComponent = fixture.debugElement.injector.get(testComponentType); + // initial the styles are not set: + expect(element[dirProperty]).toBe(false); + expect(element._elm.nativeElement.classList.contains(style)).toBe(false); + // test various ways to set the property value, and the result of having the class or not: + booleanAttributeStyleTest(fixture, testComponent, element, property, dirProperty, style, sync); +} + export function hasRipple(el: HTMLElement) { if (!el.classList.contains('mdc-ripple-upgraded')) tick(20); // wait 16ms needed for requestAnimationFrame of ripple @@ -50,8 +64,14 @@ export function cancelledClick(el: HTMLElement) { } export function simulateEscape() { - event = new KeyboardEvent('keydown', { - key: 'Escape' + simulateKey(document, 'Escape'); +} + +export function simulateKey(element: Element | Document, key: string, name = 'keydown') { + event = new KeyboardEvent(name, { + key, + bubbles: true, + cancelable: true }); - document.dispatchEvent(event); + element.dispatchEvent(event); } diff --git a/bundle/src/testutils/util.ts b/bundle/src/testutils/util.ts new file mode 100644 index 0000000..8df8172 --- /dev/null +++ b/bundle/src/testutils/util.ts @@ -0,0 +1,22 @@ +/** + * Like spyOnAllFunctions, but that function has a bug in the current Jasmine, leading to exception + * when trying it on a foundation class. + */ +export function spyOnAll(object: any) { + let pointer = object; + while (pointer) { + for (const prop in pointer) { + if (object[prop] && object[prop].and) + // already spied on: + continue; + if (Object.prototype.hasOwnProperty.call(pointer, prop) && pointer[prop] instanceof Function) { + const descriptor = Object.getOwnPropertyDescriptor(pointer, prop); + if ((descriptor!.writable || descriptor!.set) && descriptor!.configurable) { + spyOn(object, prop).and.callThrough(); + } + } + } + pointer = Object.getPrototypeOf(pointer); + } + return object; +} diff --git a/bundle/src/utils/mdc.event.registry.ts b/bundle/src/utils/mdc.event.registry.ts index fa2807f..71aa945 100644 --- a/bundle/src/utils/mdc.event.registry.ts +++ b/bundle/src/utils/mdc.event.registry.ts @@ -1,6 +1,7 @@ -import { ElementRef, Injectable, Optional, Renderer2, SkipSelf } from '@angular/core'; +import { ElementRef, Injectable, Renderer2 } from '@angular/core'; +import { SpecificEventListener } from '@material/base'; -type UnlistenerMap = WeakMap; +type UnlistenerMap = WeakMap, Function>; const unlisteners: Map = new Map(); @Injectable({ @@ -9,11 +10,11 @@ const unlisteners: Map = new Map() export class MdcEventRegistry { constructor() {} - listen(renderer: Renderer2, type: string, listener: EventListener, ref: ElementRef, options?: any) { + listen(renderer: Renderer2, type: string, listener: EventListener | SpecificEventListener, ref: ElementRef, options?: any) { this.listenElm(renderer, type, listener, ref.nativeElement, options); } - listenElm(renderer: Renderer2, type: string, listener: EventListener, el: Element | Window | Document, options?: any) { + listenElm(renderer: Renderer2, type: string, listener: EventListener | SpecificEventListener, el: Element | Window | Document, options?: any) { el.addEventListener(type, listener, options); const unlistener = function() { el.removeEventListener(type, listener, options); @@ -21,19 +22,19 @@ export class MdcEventRegistry { this.registerUnlisten(type, listener, unlistener); } - registerUnlisten(type: string, listener: EventListener, unlistener: Function) { + private registerUnlisten(type: string, listener: EventListener | SpecificEventListener, unlistener: Function) { if (!unlisteners.has(type)) unlisteners.set(type, new WeakMap()); - unlisteners.get(type).set(listener, unlistener); + unlisteners.get(type)!.set(listener, unlistener); } - unlisten(type: string, listener: EventListener) { + unlisten(type: string, listener: EventListener | SpecificEventListener) { if (!unlisteners.has(type)) return; const unlistenerMap = unlisteners.get(type); - if (!unlistenerMap.has(listener)) + if (!unlistenerMap!.has(listener)) return; - unlistenerMap.get(listener)(); - unlistenerMap.delete(listener); + unlistenerMap!.get(listener)!(); + unlistenerMap!.delete(listener); } } diff --git a/bundle/src/utils/mixins.ts b/bundle/src/utils/mixins.ts new file mode 100644 index 0000000..4d36e5e --- /dev/null +++ b/bundle/src/utils/mixins.ts @@ -0,0 +1,7 @@ +export function applyMixins(derivedCtor: any, baseCtors: any[]) { + baseCtors.forEach(baseCtor => { + Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => { + Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name)!); + }); + }); +} diff --git a/bundle/src/utils/thirdparty.announce.ts b/bundle/src/utils/thirdparty.announce.ts new file mode 100644 index 0000000..b49058a --- /dev/null +++ b/bundle/src/utils/thirdparty.announce.ts @@ -0,0 +1,103 @@ +/** + * @license + * Copyright 2020 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * Priorities for the announce function + */ +export enum AnnouncerPriority { + POLITE = 'polite', + ASSERTIVE = 'assertive', + } + + /** + * Data attribute added to live region element. + */ + export const DATA_MDC_DOM_ANNOUNCE = 'data-mdc-dom-announce'; + + /** + * Announces the given message with optional priority, defaulting to "polite" + */ + export function announce(message: string, priority?: AnnouncerPriority) { + Announcer.getInstance().say(message, priority); + } + + class Announcer { + private static instance: Announcer; + private readonly liveRegions: Map; + + static getInstance(): Announcer { + if (!Announcer.instance) { + Announcer.instance = new Announcer(); + } + + return Announcer.instance; + } + + // Constructor made private to ensure only the singleton is used + private constructor() { + this.liveRegions = new Map(); + } + + say(message: string, priority: AnnouncerPriority = AnnouncerPriority.POLITE) { + const liveRegion = this.getLiveRegion(priority); + // Reset the region to pick up the message, even if the message is the + // exact same as before. + liveRegion.textContent = ''; + // Timeout is necessary for screen readers like NVDA and VoiceOver. + setTimeout(() => { + liveRegion.textContent = message; + document.addEventListener('click', clearLiveRegion); + }, 1); + + function clearLiveRegion() { + liveRegion.textContent = ''; + document.removeEventListener('click', clearLiveRegion); + } + } + + private getLiveRegion(priority: AnnouncerPriority): Element { + const existingLiveRegion = this.liveRegions.get(priority); + if (existingLiveRegion && + document.body.contains(existingLiveRegion as Node)) { + return existingLiveRegion; + } + + const liveRegion = this.createLiveRegion(priority); + this.liveRegions.set(priority, liveRegion); + return liveRegion; + } + + private createLiveRegion(priority: AnnouncerPriority): Element { + const el = document.createElement('div'); + el.style.position = 'absolute'; + el.style.top = '-9999px'; + el.style.left = '-9999px'; + el.style.height = '1px'; + el.style.overflow = 'hidden'; + el.setAttribute('aria-atomic', 'true'); + el.setAttribute('aria-live', priority); + el.setAttribute(DATA_MDC_DOM_ANNOUNCE, 'true'); + document.body.appendChild(el); + return el; + } + } \ No newline at end of file diff --git a/bundle/src/utils/value.utils.ts b/bundle/src/utils/value.utils.ts index 04ef5cd..766e5f5 100644 --- a/bundle/src/utils/value.utils.ts +++ b/bundle/src/utils/value.utils.ts @@ -7,3 +7,9 @@ export function asBooleanOrNull(value: any) { return value; return `${value}` !== 'false'; } + +export function asNumberOrNull(value: any) { + if (value == null) + return value; + return +value; +} diff --git a/bundle/tools/dgeni/index.ts b/bundle/tools/dgeni/index.ts index 41ca1a7..d211a25 100644 --- a/bundle/tools/dgeni/index.ts +++ b/bundle/tools/dgeni/index.ts @@ -65,7 +65,8 @@ apiDocsPackage.config((computePathsProcessor: any) => { // Configure custom JsDoc tags. apiDocsPackage.config((parseTagsProcessor: any) => { parseTagsProcessor.tagDefinitions = parseTagsProcessor.tagDefinitions.concat([ - {name: 'docs-private'} + {name: 'docs-private'}, + {name: 'internal'} ]); }); diff --git a/bundle/tools/dgeni/processors/docs-private-filter.ts b/bundle/tools/dgeni/processors/docs-private-filter.ts index 4731396..d05b081 100644 --- a/bundle/tools/dgeni/processors/docs-private-filter.ts +++ b/bundle/tools/dgeni/processors/docs-private-filter.ts @@ -21,10 +21,7 @@ const INTERNAL_METHODS = [ 'setDisabledState', // Don't ever need to document constructors - 'constructor', - - // tabIndex exists on all elements, no need to document it - 'tabIndex', + 'constructor' ]; /** @@ -40,7 +37,7 @@ export class DocsPrivateFilter implements Processor { /** Marks the given API doc with a property that describes its public state. */ private isPublicDoc(doc: ApiDoc) { - if (this.hasDocsPrivateTag(doc) || doc.name.startsWith('_')) { + if (this.hasInternalTag(doc) || doc.name.startsWith('_')) { return false; } else if (doc instanceof MemberDoc) { return !this.isInternalMember(doc); @@ -55,9 +52,9 @@ export class DocsPrivateFilter implements Processor { return INTERNAL_METHODS.includes(memberDoc.name); } - /** Whether the given doc has a @docs-private tag set. */ - private hasDocsPrivateTag(doc: any) { + /** Whether the given doc has a @docs-private or @internal tag set. */ + private hasInternalTag(doc: any) { const tags = doc.tags && doc.tags.tags; - return tags ? tags.find((d: any) => d.tagName == 'docs-private') : false; + return tags ? tags.find((d: any) => d.tagName === 'docs-private' || d.tagName === 'internal') : false; } } \ No newline at end of file diff --git a/bundle/tools/dgeni/templates/directive.template.html b/bundle/tools/dgeni/templates/directive.template.html index f1d57fa..50e34fa 100644 --- a/bundle/tools/dgeni/templates/directive.template.html +++ b/bundle/tools/dgeni/templates/directive.template.html @@ -1,2 +1,3 @@

Directive: {$ directive.name $}

+ {$ class(directive) $} \ No newline at end of file diff --git a/bundle/tools/ngbundler/index.ts b/bundle/tools/ngbundler/index.ts deleted file mode 100644 index bb8c4da..0000000 --- a/bundle/tools/ngbundler/index.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { rollup, InputOptions, OutputOptions } from 'rollup'; -const resolve = require('@rollup/plugin-node-resolve'); -const sourcemaps = require('rollup-plugin-sourcemaps'); - -const globals = { - '@angular/common': 'ng.common', - '@angular/core': 'ng.core', - '@angular/forms': 'ng.forms', - '@angular/router': 'ng.router', - '@material/animation': 'mdc.animation', - '@material/checkbox': 'mdc.checkbox', - '@material/chips': 'mdc.chips', - '@material/dialog': 'mdc.dialog', - '@material/drawer': 'mdc.drawer', - '@material/drawer/slidable': 'mdc.drawer', - '@material/floating-label': 'mdc.floatingLabel', - '@material/form-field': 'mdc.formField', - '@material/icon-button': 'mdc.iconButton', - '@material/icon-toggle': 'mdc.iconToggle', - '@material/linear-progress': 'mdc.linearProgress', - '@material/line-ripple': 'mdc.lineRipple', - '@material/menu': 'mdc.menu', - '@material/menu/util': 'mdc.menu', - '@material/notched-outline': 'mdc.notchedOutline', - '@material/radio': 'mdc.radio', - '@material/ripple': 'mdc.ripple', - '@material/select': 'mdc.select', - '@material/slider': 'mdc.slider', - '@material/switch': 'mdc.switch', - '@material/snackbar': 'mdc.snackbar', - '@material/textfield': 'mdc.textfield', // checked, not exported as mdc.textField yet - '@material/textfield/helper-text': 'mdc.textfield', - '@material/textfield/icon': 'mdc.textfield', - '@material/toolbar': 'mdc.toolbar', - '@material/top-app-bar': 'mdc.topAppBar', - '@material/tabs': 'mdc.tabs', - 'focus-trap': 'focusTrap', - 'rxjs': 'rxjs', - 'rxjs/operators': 'rxjs.operators', - 'tslib': 'tslib' -}; - -const inputOptions: InputOptions = { - input: 'build/material.js', - plugins: [ - resolve({jail: '/src', modulesOnly: true}), - sourcemaps() - ], - onwarn: function(warning) { - // Suppress known error message caused by TypeScript compiled code with Rollup - // https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined - if (typeof warning === 'string') - console.log("Rollup warning: ", warning) - else if (!skipWarning(warning)) - console.log("Rollup warning [", warning.code, "]: ", warning.message); - }, - external: Object.keys(globals) -}; -const outputOptionsEs5: OutputOptions = { - file: 'dist/material.es5.js', - format: 'es', - sourcemap: true, - globals: globals -}; -const outputOptionsUmd: OutputOptions = { - file: 'dist/material.umd.js', - format: 'umd', - sourcemap: true, - globals: globals, - name: 'blox.material' -}; - -async function build(writeOptions: OutputOptions) { - const bundle = await rollup(inputOptions); - await bundle.write(writeOptions); -} - -function skipWarning(warning) { - if (warning.code === 'THIS_IS_UNDEFINED' || warning.code === 'UNUSED_EXTERNAL_IMPORT') - return true; - // if (warning.code === 'CIRCULAR_DEPENDENCY') - // // NGC adds circular dependencies for every service with the "providedIn: 'root'" annotation, - // // we don't want to see them ;-): - // return (warning.message && ( - // warning.message.endsWith('.service.js -> build\\material.module.js') || - // warning.message.endsWith('.registry.js -> build\\material.module.js'))); - return false; -} - -build(outputOptionsEs5); -build(outputOptionsUmd); - diff --git a/bundle/tools/ngbundler/tsconfig.json b/bundle/tools/ngbundler/tsconfig.json deleted file mode 100644 index a916b73..0000000 --- a/bundle/tools/ngbundler/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "noUnusedParameters": true, - "lib": ["es2015", "dom", "es2016.array.include"], - "module": "commonjs", - "moduleResolution": "node", - "outDir": "../../dist/tools/ngbundler", - "strictNullChecks": true, - "noEmitOnError": true, - "noImplicitAny": false, - "target": "es5", - "types": [ - "node" - ], - "sourceMap": true - }, - "files": [ - "index.ts" - ] -} \ No newline at end of file diff --git a/bundle/tsconfig-base.json b/bundle/tsconfig-base.json index d30c57f..8ec3812 100644 --- a/bundle/tsconfig-base.json +++ b/bundle/tsconfig-base.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "es5", + "target": "es2015", "module": "es2015", "moduleResolution": "node", - "emitDecoratorMetadata": true, + "forceConsistentCasingInFileNames": true, "experimentalDecorators": true, "sourceMap": true, "noEmitHelpers": true, @@ -11,7 +11,7 @@ "skipLibCheck": true, "declaration": true, "lib": [ - "es2015", + "es2018", "dom" ], "typeRoots": [ diff --git a/bundle/tsconfig-lib.json b/bundle/tsconfig-lib.json index d508ddd..56390fb 100644 --- a/bundle/tsconfig-lib.json +++ b/bundle/tsconfig-lib.json @@ -1,19 +1,25 @@ { "extends": "./tsconfig-base.json", "compilerOptions": { - "outDir": "build" + "baseUrl": ".", + "outDir": "AUTOGENERATED", + "declarationDir": "AUTOGENERATED", + "strict": true, + "stripInternal": true, + "inlineSourceMap": true, + "inlineSources": true, + "emitDecoratorMetadata": false }, - "files": [ - "src/material.module.ts" - ], + "files": ["AUTOGENERATED"], + "exclude": ["node_modules", "dist", "**/*.ngfactory.ts", "**/*.shim.ts", "**/*.spec.ts"], "angularCompilerOptions": { + "enableIvy": false, + "enableResourceInlining": true, "skipMetadataEmit" : false, - "strictMetadataEmit": true, "skipTemplateCodegen": true, - "flatModuleOutFile": "material.js", - "flatModuleId": "@blox/material", - "generateCodeForLibraries": true, - "preserveWhitespaces": false, - "enableIvy": false + "strictMetadataEmit": true, + "strictInjectionParameters": true, + "strictTemplates": true, + "fullTemplateTypeCheck": true } -} \ No newline at end of file +} diff --git a/bundle/tsconfig.json b/bundle/tsconfig.json index 48289fb..f752fbb 100644 --- a/bundle/tsconfig.json +++ b/bundle/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "./tsconfig-base.json", + "compilerOptions": { + "target": "es5", + "emitDecoratorMetadata": true + }, "include": [ "node_modules/@types", "src/**/*.ts", diff --git a/docs/migration/migration-0-to-1.md b/docs/migration/migration-0-to-1.md new file mode 100644 index 0000000..f27bdcd --- /dev/null +++ b/docs/migration/migration-0-to-1.md @@ -0,0 +1,461 @@ +# Migrate from Blox Material v0.18.1 to v1.0.0 + +The material-components-web dependency has been upgraded to version 5.1.0. This upgrade includes substantial changes to many of the material components DOM-structure, and their styling via Sass. The Sass theming structure has chenged to use the new Sass module structure via `@use` instead of `@import`. More information can be found at [Material Components Web Theming](https://github.com/material-components/material-components-web/blob/master/docs/theming.md), and in the documentation for our components at [Blox Material Components](https://material.src.zone/components). + +The remainder of this upgrade guide focuses on the new DOM-structure, and on changes in properties and action handlers +that are introduced by the new material-components-web. + +## Button + +* No changes required +* When adding a trailing `mdcButtonIcon` to the button, the label should be wrapped in an `mdcButtonLabel` directive: + ```html + + ``` + +## Card + +* No changes required + +## Checkbox + +* No changes required + +## Chips + +* Chip DOM structure has changed +* The `mdcChipText` should be wrapped in `mdcChipCell` + `mdcChipPrimaryAction`. Before: + ```html +
+ wb_sunny +
Turn lights on
+
+ ``` + After: + ```html +
+ wb_sunny + + +
Turn lights on
+
+
+
+ ``` +* An (optional) trailing icon for input chips should be wrapped in an `mdcChipCell`. Before: + ```html +
+ face +
Text
+ cancel +
+ ``` + After: + ```html +
+ face + + +
Text
+
+
+ + cancel + +
+ ``` + +## Dialog + +* The `mdcFocusTrap` directive is not required anymore. An `mdcDialog` will automatically also have the focus trap directive attached. +* The `scrollable` property from `mdcDialogBody` is dropped. Whether a dialog body must be scrollable is now automatically detected by the dialog based on the height of the dialog body. +* The DOM structure has changed: + * `mdcDialogSurface` must be wrapped in `mdcDialogContainer`. + * `mdcDialogHeader` + `mdcDialogHeaderTitle` is replaced by `mdcDialogTitle`. + * `mdcDialogBody` is replaced by `mdcDialogContent`. + * `mdcDialogFooter` is replaced by `mdcDialogActions`. + * `mdcDialogCancel` should be raplced by `mdcDialogTrigger="close"`. + * `mdcDialogAccept` should be replaced by `mdcDialogTrigger="accept"`. + * `mdcDialogBackdrop` should be replaced by `mdcDialogScrim`. + + Before: + ```html + + ``` + After: + ```html + + ``` + +## Drawer + +* The drawer types are now named: `permanent`, `dismissible` (was `persistent`), and `modal` (was `temporary`). +* The DOM structure has changed: + * `mdcDrawerContainer` is not wrapping `mdcDrawer` anymore, and its properties are moved to `mdcDrawer` + (this only affects `dismissible` and `modal` drawers). + * `mdcDrawerToolbarSpacer` does not exist anymore. + * `mdcDrawerHeaderContent` is replaced by `mdcDrawerTitle`, and `mdcDrawerSubtitle`. + * For modal drawers an `mdcDrawerScrim` should be added as a sibling element of the `mdcDrawer`. + * For `dismissible` drawers it is recommended to apply the `mdcDrawerAppContent` directive to + the sibling element next to the drawer so that open/close animations work correctly. + + Before: + ```html + +
page content
+ ``` + After: + ```html + +
+
page content
+ ``` + +## Elevation + +* No changes required + +## Floating Action Button + +* The `extended` property is removed. A floating action button will automatically be + *extended* when it contains an `mdcFabLabel`. Before: + ```html + + ``` + After: + ```html + + ``` + +## Focus Trap + +* A focus trap is now automatically applied to `mdcDialog` and modal `mdcDrawer` directives. So you should remove `mdcFocusTrap` from elements with those directives. +* The escape key does not untrap an `mdcFocusTrap` anymore. Add your own handlers if untrapping on Escape key press is required. (Note that `mdcDialog` and `mdcDrawer` already have their own handlers for the Escape key, so handling Escape is only needed if you are implementing a raw `mdcFocusTrap`). +* `mdcFocusTrap` does not block mouse interaction anymore. Add a scrim element to prevent mouse interactions outside the trap (for an example check out the demo at https://material.src.zone/components/focus-trap). Please note that `mdcDialog` and `mdcDrawer` already come with scrim elements. +* Property `untrapOnOutsideClick` is not supported anymore. Please add your own click handler to the scrim mentioned in the previous bullet. +* Property `ignoreEscape` is not supported anymore. See the previous comments about handling the Escape key. + +## Icon Button + +* No changes required for the non-toggling variant of `mdcIconButton`. +* The DOM structure has changed for toggling `mdcIconButton`. The on/off icons are now child elements of `mdcIconButton`. Before: + ```html + + ``` + After: + ```html + + ``` +* See https://material.src.zone/components/icon-button for more examples, including samples for SVG icons, and samples for icon fonts that use classnames instead of ligatures. + +## Icon toggle + +* `mdcIconToggle` is replaced by `mdcIconButton`. See above. + +## Linear Progress + +* No changes required + +## List + +* The `activated` property was removed. Use `selected` to enable either the *activated*, or the *selected* state. The `mdcList` will choose between the different selection modes (`aria-current`, `aria-selected`, `aria-checked`) depending on `selectionMode` and DOM-structure. +* Not setting the `nonInteractive` property will now make the list fully interactive. Previously a list without `nonInteractive` set would only have stylings applied, but mouse and keyboard actions were not handled. +* The DOM-structure of single-line-lists has changed. The text of each item should now be wrapped in `mdcListItemText` directives. Before: + ```html +
  • Wi-Fi
  • + ``` + After: + ```html +
  • + Wi-Fi +
  • + ``` +* The DOM structure of two-line-lists has changed. The primary text of a list item should now be wrapped in `mdcListItemPrimary` directives. Before: + ```html +
  • + + Wi-Fi + Strong signal + +
  • + ``` + After: + ```html +
  • + + Wi-Fi + Strong signal + +
  • + ``` + +## Menu + +* It is recommended to open an `mdcMenu` through an `mdcMenuTrigger` directive. This takes care of following ARIA recommended practices for focusing the correct element, and maintaining proper `aria-*` and `role` attributes on the interaction element, menu, and list. +* The `cancel` output has been removed. For detecting if the menu was closed without any menu choice selection, try to use `afterClosed` in combination with listening for `pick`. +* The DOM-structure of menu items has changed. Before: + ```html +
  • Reload
  • + ``` + After: + ```html +
  • + Reload +
  • + ``` + +## Radio Button + +* No changes required + +## Ripple + +* No changes required + +## Select +* The `box` and `outlined` property are gone. An `mdcSelect` will now display in the `outlined` variant when the `mdcFloatingLabel` is wrapped inside `mdcNotchedOutline` and `mdcNotchedOutlineNotch` directives. Otherwise the boxed variant will be used. You can change the styling at runtime, by changing the DOM-structure, as demonstrated in the [Select Component Guide](material.src.zone/components/select). +* The `mdcSelect` does not wrap a native `select` input element anymore, but uses `mdcSelectMenu` and `mdcList` for the list of choices. +* There is no need anymore to include an empty disabled option value for representing the *no choice* state. +* For an outlined `mdcSelect` the changes are as follows. Before: + ```html +
    + + +
    + ``` + After: + ```html +
    +
    +
    {{value}}
    + + + Pick a Color + + +
    +
    +
      +
    • Green
    • +
    • Orange
    • +
    • Red
    • +
    +
    +
    + ``` +* For a boxed `mdcSelect` the changes are as follows. Before: + ```html +
    + + +
    + ``` + After: + ```html +
    +
    +
    {{value}}
    + Pick a Color +
    +
    +
      +
    • Green
    • +
    • Orange
    • +
    • Red
    • +
    +
    +
    + ``` + +## Slider + +* No changes required + +## Snackbar +* The `MdcSnackbarService` property `startAligned` property is replaced by a properyy with the name `leading`. +* The `MdcSnackbarService` property `dismissesOnAction` was removed. Snackbars will always close when the action button is clicked. +* The property `multiline` of `MdcSnackbarMessage` is replaced by a property with the name `stacked`. +* The property `actionOnBottom` was removed. Set the `stacked` property when the action button must be shown below the text instead of adjacent to the text. +* The default value for the `timeout` property of an `MdcSnackbarMessage` was changed from 2750ms to 5000ms. +* The property (observer) `afterShow` of `MdcSnackbarRef` was replaced by property `afterOpened`. +* The property (observer) `afterHide` of `MdcSnackbarRef` was replaced by property `afterClosed`. + +## Switch + +* The DOM-structure has changed. Before: + ```html +
    + +
    + ``` + After: + ```html +
    +
    + +
    +
    + ``` + +## Tabs + +* The old `mdcTab*` directives have been replaced by completely new `mdcTab*` directives, based on a new material components web component. +* For details about the new components please check the [Tab Directives Guide](material.src.zone/components/tabs). +* The `mdcTabBarScroller*` directives are removed. A scroller must now always be added by having an `mdcTabScroller` directive inside the `mdcTabBar`. (The old `mdcTabBarScroller*` directives were optional, and were wrapping the tab bar instead of being wrapped by it). +* The `mdcTabRouter` directive is now implied by having an element that has both an `mdcTab` and a `routerLink` attribute. It is recommended to change `mdcTabRouter` to `mdcTab` (although `mdcTabRouter` is still supported for backward compatibility). +* The most notable changes are documented with the following snippets. Before: + ```html + + ``` + After: + ```html + + ``` + +## Text Field +* The `box` and `outlined` property are gone. An `mdcTextField` will now display in the `outlined` variant when the `mdcFloatingLabel` is wrapped inside `mdcNotchedOutline` and `mdcNotchedOutlineNotch` directives. Otherwise the boxed variant will be used. You can change the styling at runtime, by changing the DOM-structure, as demonstrated in the [Text Field Component Guide](material.src.zone/components/text-field). +* `mdcTextFieldHelperText` must now be wrapped inside an `mdcTextFieldHelperLine` directive. +* For an outlined `mdcTextField` the changes are as follows. Before: + ```html +
    + + +
    +

    Help text

    + ``` + After: + ```html + +
    +

    Help text

    +
    + ``` +* For a boxed `mdcTextField` the changes are as follows. Before: + ```html +
    + + +
    +

    Help text

    + ``` + After: + ```html + +
    +

    Help text

    +
    + ``` + +## Toolbar + +* `mdcToolbar` was replaced by `mdcTopAppBar`. Please see https://material.src.zone/components/top-app-bar + for instructions and examples on using the `mdcTopAppBar` directive. + +## Utility + +* All documented utility directives have remained unchanged. diff --git a/package-lock.json b/package-lock.json index f0e9791..d068d9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3,274 +3,311 @@ "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "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==", "dev": true }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", - "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true - } } }, "@commitlint/cli": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-8.3.5.tgz", - "integrity": "sha512-6+L0vbw55UEdht71pgWOE55SRgb+8OHcEwGDB234VlIBFGK9P2QOBU7MHiYJ5cjdjCQ0rReNrGjOHmJ99jwf0w==", - "dev": true, - "requires": { - "@commitlint/format": "^8.3.4", - "@commitlint/lint": "^8.3.5", - "@commitlint/load": "^8.3.5", - "@commitlint/read": "^8.3.4", - "babel-polyfill": "6.26.0", - "chalk": "2.4.2", - "get-stdin": "7.0.0", - "lodash": "4.17.15", - "meow": "5.0.0", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", + "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "@commitlint/format": "^11.0.0", + "@commitlint/lint": "^11.0.0", + "@commitlint/load": "^11.0.0", + "@commitlint/read": "^11.0.0", + "chalk": "4.1.0", + "core-js": "^3.6.1", + "get-stdin": "8.0.0", + "lodash": "^4.17.19", "resolve-from": "5.0.0", - "resolve-global": "1.0.0" + "resolve-global": "1.0.0", + "yargs": "^15.1.0" } }, "@commitlint/ensure": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-8.3.4.tgz", - "integrity": "sha512-8NW77VxviLhD16O3EUd02lApMFnrHexq10YS4F4NftNoErKbKaJ0YYedktk2boKrtNRf/gQHY/Qf65edPx4ipw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", + "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", "dev": true, "requires": { - "lodash": "4.17.15" + "@commitlint/types": "^11.0.0", + "lodash": "^4.17.19" } }, "@commitlint/execute-rule": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz", - "integrity": "sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", + "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", "dev": true }, "@commitlint/format": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-8.3.4.tgz", - "integrity": "sha512-809wlQ/ND6CLZON+w2Rb3YM2TLNDfU2xyyqpZeqzf2reJNpySMSUAeaO/fNDJSOKIsOsR3bI01rGu6hv28k+Nw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", + "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", "dev": true, "requires": { - "chalk": "^2.0.1" + "@commitlint/types": "^11.0.0", + "chalk": "^4.0.0" } }, "@commitlint/is-ignored": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-8.3.5.tgz", - "integrity": "sha512-Zo+8a6gJLFDTqyNRx53wQi/XTiz8mncvmWf/4oRG+6WRcBfjSSHY7KPVj5Y6UaLy2EgZ0WQ2Tt6RdTDeQiQplA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", + "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", "dev": true, "requires": { - "semver": "6.3.0" + "@commitlint/types": "^11.0.0", + "semver": "7.3.2" } }, "@commitlint/lint": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-8.3.5.tgz", - "integrity": "sha512-02AkI0a6PU6rzqUvuDkSi6rDQ2hUgkq9GpmdJqfai5bDbxx2939mK4ZO+7apbIh4H6Pae7EpYi7ffxuJgm+3hQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", + "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", "dev": true, "requires": { - "@commitlint/is-ignored": "^8.3.5", - "@commitlint/parse": "^8.3.4", - "@commitlint/rules": "^8.3.4", - "babel-runtime": "^6.23.0", - "lodash": "4.17.15" + "@commitlint/is-ignored": "^11.0.0", + "@commitlint/parse": "^11.0.0", + "@commitlint/rules": "^11.0.0", + "@commitlint/types": "^11.0.0" } }, "@commitlint/load": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-8.3.5.tgz", - "integrity": "sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", + "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", "dev": true, "requires": { - "@commitlint/execute-rule": "^8.3.4", - "@commitlint/resolve-extends": "^8.3.5", - "babel-runtime": "^6.23.0", - "chalk": "2.4.2", - "cosmiconfig": "^5.2.0", - "lodash": "4.17.15", + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", "resolve-from": "^5.0.0" } }, "@commitlint/message": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-8.3.4.tgz", - "integrity": "sha512-nEj5tknoOKXqBsaQtCtgPcsAaf5VCg3+fWhss4Vmtq40633xLq0irkdDdMEsYIx8rGR0XPBTukqzln9kAWCkcA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", + "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", "dev": true }, "@commitlint/parse": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-8.3.4.tgz", - "integrity": "sha512-b3uQvpUQWC20EBfKSfMRnyx5Wc4Cn778bVeVOFErF/cXQK725L1bYFvPnEjQO/GT8yGVzq2wtLaoEqjm1NJ/Bw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", + "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", "dev": true, "requires": { - "conventional-changelog-angular": "^1.3.3", - "conventional-commits-parser": "^3.0.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "conventional-changelog-angular": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", - "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - } + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-parser": "^3.0.0" } }, "@commitlint/read": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-8.3.4.tgz", - "integrity": "sha512-FKv1kHPrvcAG5j+OSbd41IWexsbLhfIXpxVC/YwQZO+FR0EHmygxQNYs66r+GnhD1EfYJYM4WQIqd5bJRx6OIw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", + "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", "dev": true, "requires": { - "@commitlint/top-level": "^8.3.4", - "@marionebl/sander": "^0.6.0", - "babel-runtime": "^6.23.0", + "@commitlint/top-level": "^11.0.0", + "fs-extra": "^9.0.0", "git-raw-commits": "^2.0.0" } }, "@commitlint/resolve-extends": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz", - "integrity": "sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", + "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", "dev": true, "requires": { "import-fresh": "^3.0.0", - "lodash": "4.17.15", + "lodash": "^4.17.19", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" } }, "@commitlint/rules": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-8.3.4.tgz", - "integrity": "sha512-xuC9dlqD5xgAoDFgnbs578cJySvwOSkMLQyZADb1xD5n7BNcUJfP8WjT9W1Aw8K3Wf8+Ym/ysr9FZHXInLeaRg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", + "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", "dev": true, "requires": { - "@commitlint/ensure": "^8.3.4", - "@commitlint/message": "^8.3.4", - "@commitlint/to-lines": "^8.3.4", - "babel-runtime": "^6.23.0" + "@commitlint/ensure": "^11.0.0", + "@commitlint/message": "^11.0.0", + "@commitlint/to-lines": "^11.0.0", + "@commitlint/types": "^11.0.0" } }, "@commitlint/to-lines": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-8.3.4.tgz", - "integrity": "sha512-5AvcdwRsMIVq0lrzXTwpbbG5fKRTWcHkhn/hCXJJ9pm1JidsnidS1y0RGkb3O50TEHGewhXwNoavxW9VToscUA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", + "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", "dev": true }, "@commitlint/top-level": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-8.3.4.tgz", - "integrity": "sha512-nOaeLBbAqSZNpKgEtO6NAxmui1G8ZvLG+0wb4rvv6mWhPDzK1GNZkCd8FUZPahCoJ1iHDoatw7F8BbJLg4nDjg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", + "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" }, "dependencies": { "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "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 } } }, - "@marionebl/sander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@marionebl/sander/-/sander-0.6.1.tgz", - "integrity": "sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s=", + "@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", + "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", + "dev": true + }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "dev": true, "requires": { - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" + "debug": "^4.1.1" } }, - "@types/color-name": { + "@kwsites/promise-deferred": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "@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==", "dev": true }, "@types/parse-json": { @@ -295,22 +332,19 @@ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "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 }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "color-convert": "^2.0.1" } }, "array-find-index": { @@ -331,34 +365,11 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "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==", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -382,32 +393,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -415,31 +400,30 @@ "dev": true }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "ci-info": { @@ -448,36 +432,40 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "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" + } + }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "requires": { "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" + "dot-prop": "^5.1.0" } }, "compare-versions": { @@ -518,98 +506,134 @@ } }, "conventional-changelog": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.18.tgz", - "integrity": "sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ==", + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.6", - "conventional-changelog-atom": "^2.0.3", - "conventional-changelog-codemirror": "^2.0.3", - "conventional-changelog-conventionalcommits": "^4.2.3", - "conventional-changelog-core": "^4.1.4", - "conventional-changelog-ember": "^2.0.4", - "conventional-changelog-eslint": "^3.0.4", - "conventional-changelog-express": "^2.0.1", - "conventional-changelog-jquery": "^3.0.6", - "conventional-changelog-jshint": "^2.0.3", - "conventional-changelog-preset-loader": "^2.3.0" + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" } }, "conventional-changelog-angular": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", - "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", "dev": true, "requires": { - "compare-func": "^1.3.1", + "compare-func": "^2.0.0", "q": "^1.5.1" } }, "conventional-changelog-atom": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", - "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-cli": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz", - "integrity": "sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.1.1.tgz", + "integrity": "sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog": "^3.1.18", + "conventional-changelog": "^3.1.24", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^8.0.0", "tempfile": "^3.0.0" } }, "conventional-changelog-codemirror": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", - "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-conventionalcommits": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz", - "integrity": "sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", "dev": true, "requires": { - "compare-func": "^1.3.1", + "compare-func": "^2.0.0", "lodash": "^4.17.15", "q": "^1.5.1" } }, "conventional-changelog-core": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz", - "integrity": "sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.1.tgz", + "integrity": "sha512-8cH8/DEoD3e5Q6aeogdR5oaaKs0+mG6+f+Om0ZYt3PNv7Zo0sQhu4bMDRsqAF+UTekTAtP1W/C41jH/fkm8Jtw==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.11", - "conventional-commits-parser": "^3.0.8", + "conventional-changelog-writer": "^4.0.18", + "conventional-commits-parser": "^3.2.0", "dateformat": "^3.0.0", "get-pkg-repo": "^1.0.0", "git-raw-commits": "2.0.0", "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^3.0.1", + "git-semver-tags": "^4.1.1", "lodash": "^4.17.15", - "normalize-package-data": "^2.3.5", + "normalize-package-data": "^3.0.0", "q": "^1.5.1", "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" + "shelljs": "^0.8.3", + "through2": "^4.0.0" }, "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, "git-raw-commits": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", @@ -635,6 +659,46 @@ } } }, + "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 + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", @@ -650,84 +714,246 @@ "read-pkg-up": "^3.0.0", "redent": "^2.0.0", "trim-newlines": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true } } }, "conventional-changelog-ember": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", - "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-eslint": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", - "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-express": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", - "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-jquery": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", - "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-jshint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", - "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, "requires": { - "compare-func": "^1.3.1", + "compare-func": "^2.0.0", "q": "^1.5.1" } }, "conventional-changelog-preset-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz", - "integrity": "sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, "conventional-changelog-writer": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", - "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", + "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", "dev": true, "requires": { - "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", - "handlebars": "^4.4.0", + "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^8.0.0", "semver": "^6.0.0", "split": "^1.0.0", - "through2": "^3.0.0" + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "conventional-commits-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", - "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -735,84 +961,40 @@ } }, "conventional-commits-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", - "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", + "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^8.0.0", "split2": "^2.0.0", - "through2": "^3.0.0", + "through2": "^4.0.0", "trim-off-newlines": "^1.0.0" } }, "conventional-recommended-bump": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.5.tgz", - "integrity": "sha512-srkferrB4kACPEbKYltZwX1CQZAEqbQkabKN444mavLRVMetzwJFJf23/+pwvtMsWbd+cc4HaleV1nHke0f8Rw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, "requires": { "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.0", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.8", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^3.0.1", - "meow": "^5.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", "q": "^1.5.1" - }, - "dependencies": { - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - } - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", + "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==", "dev": true }, "core-util-is": { @@ -822,33 +1004,16 @@ "dev": true }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "currently-unhandled": { @@ -861,13 +1026,10 @@ } }, "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true }, "dateformat": { "version": "3.0.3", @@ -876,12 +1038,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -909,14 +1071,20 @@ } }, "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.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==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -932,28 +1100,35 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "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==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs.realpath": { @@ -962,6 +1137,18 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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-pkg-repo": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", @@ -1007,6 +1194,12 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, + "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 + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -1016,19 +1209,6 @@ "repeating": "^2.0.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://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" - } - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -1053,13 +1233,16 @@ "trim-newlines": "^1.0.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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": { - "error-ex": "^1.2.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "path-exists": { @@ -1082,12 +1265,6 @@ "pinkie-promise": "^2.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -1119,14 +1296,11 @@ "strip-indent": "^1.0.1" } }, - "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" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "strip-indent": { "version": "1.0.1", @@ -1156,22 +1330,22 @@ } }, "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, "git-raw-commits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.3.tgz", - "integrity": "sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.8.tgz", + "integrity": "sha512-6Gk7tQHGMLEL1bSnrMJTCVt2AQl4EmCcJDtzs/JJacCb2+TNEyHM67Gp7Ri9faF7OcGpjGGRjHLvs/AG7QKZ2Q==", "dev": true, "requires": { - "dargs": "^4.0.1", + "dargs": "^7.0.0", "lodash.template": "^4.0.2", - "meow": "^5.0.0", + "meow": "^8.0.0", "split2": "^2.0.0", - "through2": "^3.0.0" + "through2": "^4.0.0" } }, "git-remote-origin-url": { @@ -1182,24 +1356,24 @@ "requires": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } }, "git-semver-tags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.1.tgz", - "integrity": "sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "requires": { - "meow": "^5.0.0", + "meow": "^8.0.0", "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "gitconfiglocal": { @@ -1235,140 +1409,76 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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==", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, - "husky": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", - "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.5.1", - "cosmiconfig": "^6.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" } }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1384,9 +1494,9 @@ } }, "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { @@ -1412,9 +1522,9 @@ "dev": true }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "is-arrayish": { @@ -1423,11 +1533,14 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } }, "is-finite": { "version": "1.1.0", @@ -1435,10 +1548,16 @@ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-plain-obj": { @@ -1474,34 +1593,54 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -1509,31 +1648,42 @@ "dev": true }, "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "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": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "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" + } + } } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "lodash._reinterpolate": { @@ -1577,29 +1727,46 @@ "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==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", "dev": true }, "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1616,22 +1783,14 @@ "dev": true }, "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" } }, "modify-values": { @@ -1647,29 +1806,21 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", "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 - } } }, "number-is-nan": { @@ -1694,51 +1845,33 @@ } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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": "^1.1.0" + "p-limit": "^2.2.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { @@ -1757,19 +1890,21 @@ "dev": true }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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": { @@ -1785,18 +1920,15 @@ "dev": true }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { @@ -1815,62 +1947,50 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" }, "dependencies": { "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "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 } } }, @@ -1896,30 +2016,72 @@ "dev": true }, "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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 + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "readable-stream": { @@ -1947,19 +2109,19 @@ } }, "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "repeating": { @@ -1971,12 +2133,25 @@ "is-finite": "^1.0.0" } }, + "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.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -1995,15 +2170,6 @@ "global-dirs": "^0.1.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2011,9 +2177,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "semver-compare": { @@ -2023,15 +2189,21 @@ "dev": true }, "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true + }, + "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, "requires": { "glob": "^7.0.0", @@ -2040,18 +2212,20 @@ } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.31.0.tgz", + "integrity": "sha512-/+rmE7dYZMbRAfEmn8EUIOwlM2G7UdzpkC60KF86YAfXGnmGtsPrKsym0hKvLBdFLLW019C+aZld1+6iIVy5xA==", "dev": true, "requires": { - "debug": "^4.0.1" + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.1" } }, "slash": { @@ -2067,9 +2241,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "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", @@ -2077,15 +2251,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "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.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "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", @@ -2093,9 +2267,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "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": { @@ -2128,11 +2302,16 @@ } } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "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" + } }, "string_decoder": { "version": "1.1.1", @@ -2143,25 +2322,40 @@ "safe-buffer": "~5.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==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "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-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "temp-dir": { @@ -2193,18 +2387,31 @@ "dev": true }, "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "readable-stream": "2 || 3" + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", "dev": true }, "trim-off-newlines": { @@ -2213,6 +2420,12 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -2220,15 +2433,17 @@ "dev": true }, "uglify-js": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", - "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.5.tgz", + "integrity": "sha512-btvv/baMqe7HxP7zJSF7Uc16h1mSfuuSplT0/qdjxseesDU+yYzH33eHBH+eMdeRXwujXspaCTooWHQVVBh09w==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - } + "optional": true + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true }, "util-deprecate": { "version": "1.0.2", @@ -2252,6 +2467,12 @@ "spdx-expression-parse": "^3.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", @@ -2259,11 +2480,22 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "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", @@ -2276,23 +2508,66 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "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==", + "dev": true + }, "yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.7" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "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": { + "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" + } + } } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 6680816..1a6dd93 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,12 @@ "commitmsg": "commitlint -e" }, "devDependencies": { - "@commitlint/cli": "^8.3.5", - "conventional-changelog-angular": "^5.0.6", - "conventional-changelog-cli": "^2.0.31", - "conventional-recommended-bump": "^6.0.5", - "husky": "^4.2.3", - "shelljs": "^0.8.3", - "simple-git": "^1.132.0" + "@commitlint/cli": "^11.0.0", + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-cli": "^2.1.1", + "conventional-recommended-bump": "^6.1.0", + "husky": "^4.3.8", + "shelljs": "^0.8.4", + "simple-git": "^2.31.0" } } diff --git a/site/browserslist b/site/.browserslistrc similarity index 100% rename from site/browserslist rename to site/.browserslistrc diff --git a/site/.firebaserc b/site/.firebaserc new file mode 100644 index 0000000..a5e80c7 --- /dev/null +++ b/site/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "blox-36b2f" + } +} diff --git a/site/CHANGELOG.md b/site/CHANGELOG.md index 96f442c..673abda 100644 --- a/site/CHANGELOG.md +++ b/site/CHANGELOG.md @@ -3,6 +3,62 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + + +# [1.0.0](https://github.com/src-zone/material/compare/v1.0.0-beta.5...v1.0.0) (2021-02-03) + + + + +# [1.0.0-beta.5](https://github.com/src-zone/material/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2021-01-29) + + +### Bug Fixes + +* resolve issues with angular 11.1 by generating code for ViewEngine (instead of Ivy). ([3b987cf](https://github.com/src-zone/material/commit/3b987cfb052e32d019020e198436314c01ac25bb)) + + + + +# [1.0.0-beta.4](https://github.com/src-zone/material/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2021-01-29) + + +### Bug Fixes + +* styling for disabled select items ([1ea1b44](https://github.com/src-zone/material/commit/1ea1b447b0dc3f1c6c86826501b7caab01665390)) +* **chip:** only one chip of a set should be tabbable at any time ([#716](https://github.com/src-zone/material/issues/716)) ([2a10d96](https://github.com/src-zone/material/commit/2a10d96c953dcb60963ed26b502ef235741e7705)) +* **docs:** fix highlight.js code highlighting for IE11 ([5e83320](https://github.com/src-zone/material/commit/5e8332005d2a53f3b19858b87176993f55429578)) +* **drawer:** fix open-state and focus of drawer when changing type to modal on an already open drawer ([0be9442](https://github.com/src-zone/material/commit/0be94424b67cb4a56c32b5b0090bf9d1fd65d249)) + + + + +# [1.0.0-beta.3](https://github.com/src-zone/material/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2020-12-18) + + + + +# [1.0.0-beta.2](https://github.com/src-zone/material/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2020-12-18) + + +### Build System + +* upgrade dependencies, including angular to version 11 ([0793ad7](https://github.com/src-zone/material/commit/0793ad77e715ef6f0073447bec22471fe5aab06e)) + + +### BREAKING CHANGES + +* - material now requires at least angular@10 +- material now requires the Ivy engine (which is already the default from angular 10 onwards) + + + + +# [1.0.0-beta.1](https://github.com/src-zone/material/compare/v0.18.1...v1.0.0-beta.1) (2020-11-13) + + + ## [0.18.1](https://github.com/src-zone/material/compare/v0.18.0...v0.18.1) (2020-07-14) diff --git a/site/angular.json b/site/angular.json index b02b965..0836071 100644 --- a/site/angular.json +++ b/site/angular.json @@ -18,13 +18,12 @@ "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist", - "index": "src/html/material.html", + "index": "src/html/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", "aot": true, "assets": [ - "src/assets", { "glob": "*.*", "input": "src/public/", @@ -32,13 +31,22 @@ } ], "styles": [ - "src/style/app.scss" + { + "input": "src/style/dark.scss", + "inject": true, + "bundleName": "dark" + }, + { + "input": "src/style/funky.scss", + "inject": false, + "bundleName": "funky" + } ], "stylePreprocessorOptions": { "includePaths": [ - "node_modules", - "node_modules/bourbon/core", - "node_modules/bourbon-neat/core" + "node_modules", + "node_modules/bourbon/core", + "node_modules/bourbon-neat/core" ] }, "scripts": [] @@ -54,7 +62,6 @@ "optimization": true, "outputHashing": "all", "sourceMap": true, - "extractCss": true, "namedChunks": true, "extractLicenses": true, "vendorChunk": false, @@ -63,13 +70,13 @@ "budgets": [ { "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + "maximumWarning": "500kb", + "maximumError": "1.2mb" }, { "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" + "maximumWarning": "2kb", + "maximumError": "4kb" } ] } @@ -99,11 +106,18 @@ "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", - "assets": [ - "src/assets" - ], + "assets": [], "styles": [ - "src/style/app.scss" + { + "input": "src/style/dark.scss", + "inject": true, + "bundleName": "dark" + }, + { + "input": "src/style/funky.scss", + "inject": false, + "bundleName": "funky" + } ], "scripts": [] } diff --git a/site/firebase.json b/site/firebase.json new file mode 100644 index 0000000..c2e120c --- /dev/null +++ b/site/firebase.json @@ -0,0 +1,37 @@ +{ + "hosting": { + "public": "dist", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "cleanUrls": true, + "trailingSlash": false, + "headers": [ + { + "source": "**", + "headers": [ + {"key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains"}, + {"key": "Referrer-Policy", "value": "same-origin"}, + {"key": "X-Content-Type-Options", "value": "nosniff"}, + {"key": "X-Frame-Options", "value": "SAMEORIGIN"}, + {"key": "X-Xss-Protection", "value": "1; mode=block"}, + {"key": "Cache-Control", "value": "max-age=3600,public,stale-while-revalidate=43200,proxy-revalidate"} + ] + }, + { + "source": "404.html", + "headers": [ + {"key": "Cache-Control", "value": "max-age=300,public,stale-while-revalidate=3600,proxy-revalidate"} + ] + }, + { + "regex": ".*[.\\][0-9a-f]{18,}\\..*", + "headers": [ + {"key": "Cache-Control", "value": "max-age=31536000,public,immutable"} + ] + } + ] + } +} diff --git a/site/karma.conf.js b/site/karma.conf.js index 535c5ab..0f3bb27 100644 --- a/site/karma.conf.js +++ b/site/karma.conf.js @@ -13,12 +13,22 @@ module.exports = function (config) { require('@angular-devkit/build-angular/plugins/karma') ], client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, clearContext: false // leave Jasmine Spec Runner output visible in browser }, - coverageIstanbulReporter: { + coverageReporter: { dir: require('path').join(__dirname, './coverage/site'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'lcovonly' }, + { type: 'text-summary' } + ] }, reporters: ['progress', 'kjhtml'], port: 9876, diff --git a/site/package-lock.json b/site/package-lock.json index 18b603e..b8723ae 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1,97 +1,189 @@ { "name": "material-demo", - "version": "0.18.1", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0.tgz", - "integrity": "sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ==", + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", + "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "rxjs": "6.5.4" + "@angular-devkit/core": "11.0.4", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + } } }, "@angular-devkit/build-angular": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0.tgz", - "integrity": "sha512-ftJVNlKvIomqRfr5jFVraPqlLSUJu8YyVbFv/aCsvhNpuZGkYpTOMoJDwyywdslSTH608BIoU63IAnIz9PwUdw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/build-optimizer": "0.901.0", - "@angular-devkit/build-webpack": "0.901.0", - "@angular-devkit/core": "9.1.0", - "@babel/core": "7.9.0", - "@babel/generator": "7.9.3", - "@babel/preset-env": "7.9.0", - "@babel/template": "7.8.6", - "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "9.1.0", - "ajv": "6.12.0", - "autoprefixer": "9.7.4", - "babel-loader": "8.0.6", + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1100.4.tgz", + "integrity": "sha512-qVkMbtOwlo+k8fvOBOwwfKWMx06k4I1qrdjpRYAoZCt3cdje4EBepSciLrHnTB+ouIqWxpEDfEXTYBS98tXbBg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1100.4", + "@angular-devkit/build-optimizer": "0.1100.4", + "@angular-devkit/build-webpack": "0.1100.4", + "@angular-devkit/core": "11.0.4", + "@babel/core": "7.12.3", + "@babel/generator": "7.12.1", + "@babel/plugin-transform-runtime": "7.12.1", + "@babel/preset-env": "7.12.1", + "@babel/runtime": "7.12.1", + "@babel/template": "7.10.4", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "11.0.4", + "ansi-colors": "4.1.1", + "autoprefixer": "9.8.6", + "babel-loader": "8.1.0", "browserslist": "^4.9.1", - "cacache": "15.0.0", + "cacache": "15.0.5", "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.0", - "copy-webpack-plugin": "5.1.1", - "core-js": "3.6.4", + "copy-webpack-plugin": "6.2.1", + "core-js": "3.6.5", + "css-loader": "4.3.0", "cssnano": "4.1.10", - "file-loader": "6.0.0", + "file-loader": "6.1.1", "find-cache-dir": "3.3.1", "glob": "7.1.6", - "jest-worker": "25.1.0", + "inquirer": "7.3.3", + "jest-worker": "26.5.0", "karma-source-map-support": "1.4.0", - "less": "3.11.1", - "less-loader": "5.0.0", - "license-webpack-plugin": "2.1.4", + "less": "3.12.2", + "less-loader": "7.0.2", + "license-webpack-plugin": "2.3.1", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "0.9.0", + "mini-css-extract-plugin": "1.2.1", "minimatch": "3.0.4", - "open": "7.0.3", - "parse5": "4.0.0", - "postcss": "7.0.27", + "open": "7.3.0", + "ora": "5.1.0", + "parse5-html-rewriting-stream": "6.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "7.0.32", "postcss-import": "12.0.1", - "postcss-loader": "3.0.0", - "raw-loader": "4.0.0", - "regenerator-runtime": "0.13.5", + "postcss-loader": "4.0.4", + "raw-loader": "4.0.2", + "regenerator-runtime": "0.13.7", + "resolve-url-loader": "3.1.2", "rimraf": "3.0.2", - "rollup": "2.1.0", - "rxjs": "6.5.4", - "sass": "1.26.3", - "sass-loader": "8.0.2", - "semver": "7.1.3", + "rollup": "2.32.1", + "rxjs": "6.6.3", + "sass": "1.27.0", + "sass-loader": "10.0.5", + "semver": "7.3.2", "source-map": "0.7.3", - "source-map-loader": "0.2.4", - "source-map-support": "0.5.16", - "speed-measure-webpack-plugin": "1.3.1", - "style-loader": "1.1.3", - "stylus": "0.54.7", - "stylus-loader": "3.0.2", - "terser": "4.6.7", - "terser-webpack-plugin": "2.3.5", + "source-map-loader": "1.1.2", + "source-map-support": "0.5.19", + "speed-measure-webpack-plugin": "1.3.3", + "style-loader": "2.0.0", + "stylus": "0.54.8", + "stylus-loader": "4.3.1", + "terser": "5.3.7", + "terser-webpack-plugin": "4.2.3", + "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "4.42.0", + "webpack": "4.44.2", "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.10.3", - "webpack-merge": "4.2.2", - "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.4.0", - "worker-plugin": "4.0.2" + "webpack-dev-server": "3.11.0", + "webpack-merge": "5.2.0", + "webpack-sources": "2.0.1", + "webpack-subresource-integrity": "1.5.1", + "worker-plugin": "5.0.0" }, "dependencies": { + "@angular-devkit/build-optimizer": { + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz", + "integrity": "sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw==", + "dev": true, + "requires": { + "loader-utils": "2.0.0", + "source-map": "0.7.3", + "tslib": "2.0.3", + "typescript": "4.0.5", + "webpack-sources": "2.0.1" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -103,634 +195,1717 @@ } } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" + } + }, + "caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" } }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0.tgz", - "integrity": "sha512-Y9sz8uf2zjilhPUVYb0K9Mio6c1d5c+csuDc15CCKzELXJwyyDxilIFgn6Eu+edM0HNQGzbIwkjy4DkR9mtuTQ==", - "dev": true, - "requires": { - "loader-utils": "2.0.0", - "source-map": "0.7.3", - "tslib": "1.11.1", - "typescript": "3.8.3", - "webpack-sources": "1.4.3" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "@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==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "minimist": "^1.2.5" + "@babel/types": "^7.12.10" } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "@babel/types": "^7.10.4" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0.tgz", - "integrity": "sha512-Oze0VzIvHnoW12C80fiNH4HBu/GWmhJPXdNA7nRkU/tBQlIKnfngf8rQ0QbgecN2qdEXQpZJsP/XclTi3zugsg==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/core": "9.1.0", - "rxjs": "6.5.4" - } - }, - "@angular-devkit/core": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0.tgz", - "integrity": "sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg==", - "dev": true, - "requires": { - "ajv": "6.12.0", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.4", - "source-map": "0.7.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/types": "^7.12.7" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0.tgz", - "integrity": "sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.0", - "ora": "4.0.3", - "rxjs": "6.5.4" - } - }, - "@angular/animations": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", - "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" - }, - "@angular/cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0.tgz", - "integrity": "sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.0", - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0", - "@schematics/angular": "9.1.0", - "@schematics/update": "0.901.0", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.1.1", - "ini": "1.3.5", - "inquirer": "7.1.0", - "npm-package-arg": "8.0.1", - "npm-pick-manifest": "6.0.0", - "open": "7.0.3", - "pacote": "11.1.4", - "read-package-tree": "5.3.1", - "rimraf": "3.0.2", - "semver": "7.1.3", - "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "7.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "@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==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } }, - "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", - "dev": true - } - } - }, - "@angular/common": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", - "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" - }, - "@angular/compiler": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", - "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" - }, - "@angular/compiler-cli": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz", - "integrity": "sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g==", - "dev": true, - "requires": { - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "yargs": "15.3.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 + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@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==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@babel/types": "^7.11.0" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "@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==", "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "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==", + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", "dev": true, "requires": { - "color-name": "~1.1.4" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, - "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==", + "@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==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", "dev": true }, - "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==", + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.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==", - "dev": true + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "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 + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } }, - "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 + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" } }, - "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==", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } }, - "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 + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "@babel/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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "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 + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "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==", + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, - "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==", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "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.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" } - } - } - }, - "@angular/core": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", - "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" - }, - "@angular/forms": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", - "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" - }, - "@angular/language-service": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.0.tgz", - "integrity": "sha512-2f8ECoXrj40oS1rtIfi+F8T4WPzundcZDs8WMFNBuWYbk14v1S9sTgMEmZyePHGkPjt6IfYiLJKJCvVgrt1nxQ==", - "dev": true - }, - "@angular/platform-browser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", - "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" - }, - "@angular/platform-browser-dynamic": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", - "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" - }, - "@angular/router": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", - "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" - }, - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/compat-data": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", - "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", - "dev": true, - "requires": { - "browserslist": "^4.9.1", - "invariant": "^2.2.4", - "semver": "^5.5.0" - }, - "dependencies": { - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "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==", + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } - } - } - }, - "@babel/generator": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.0.tgz", - "integrity": "sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "electron-to-chromium": { + "version": "1.3.622", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.622.tgz", + "integrity": "sha512-AJT0Fm1W0uZlMVVkkJrcCVvczDuF8tPm3bwzQf5WO8AaASB2hwTRP7B8pU5rqjireH+ib6am8+hH5/QkXzzYKw==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.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==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "dev": true + }, + "open": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.2.tgz", + "integrity": "sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.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-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 + } + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, + "webpack-sources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", + "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "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 + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz", + "integrity": "sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw==", + "dev": true, + "requires": { + "loader-utils": "2.0.0", + "source-map": "0.7.3", + "tslib": "2.0.3", + "typescript": "4.0.5", + "webpack-sources": "2.0.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "webpack-sources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", + "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "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 + } + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1100.4.tgz", + "integrity": "sha512-uxe8gNSej3KF1FgqNtJmuRDbbINh3yLtXanXhRxFQLUj8IiNR8IciIVvy6RfXC5gqxcWwy1cOefJLLnuN9AOxQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1100.4", + "@angular-devkit/core": "11.0.4", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + } + } + }, + "@angular-devkit/core": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", + "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", + "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.0.4", + "ora": "5.1.0", + "rxjs": "6.6.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + } + } + }, + "@angular/animations": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.0.4.tgz", + "integrity": "sha512-NI7UdLNdzTfLCDu0zVqwhdKq2z1flRsM2GCD9RHG/NRjlohh73uRTBW+BcYpfh+o+Wq4giiq8UkTIgS2ReqDGg==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/cli": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.0.4.tgz", + "integrity": "sha512-VkE/gx6P80EJHg13fG+gkZfd2DJmRaDAtnamcCGM4AThzoUN9XBdxc24uMLEzBb0/mJ4vpMK9+WTNIdMmzl+Tg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1100.4", + "@angular-devkit/core": "11.0.4", + "@angular-devkit/schematics": "11.0.4", + "@schematics/angular": "11.0.4", + "@schematics/update": "0.1100.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.2.0", + "ini": "1.3.5", + "inquirer": "7.3.3", + "npm-package-arg": "8.1.0", + "npm-pick-manifest": "6.1.0", + "open": "7.3.0", + "pacote": "9.5.12", + "resolve": "1.18.1", + "rimraf": "3.0.2", + "semver": "7.3.2", + "symbol-observable": "2.0.3", + "universal-analytics": "0.4.23", + "uuid": "8.3.1" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "open": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true + } + } + }, + "@angular/common": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.0.4.tgz", + "integrity": "sha512-4R2ALj71J6EAHVCKNnHHCKL7wcosMsv3gcMXbMTE+Wpzo3khEhM0Tej+I1qmMbVmGXVlRb//4+rjE4gff6FvQw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/compiler": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.0.4.tgz", + "integrity": "sha512-Smf8FKSjkqd522ZCdXjSnVv1lYA0b21AN3WC5L1mwtRwyl/VacqCA/YEklLneDGgI2FdSIC9+bzSQIV+CCVftA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/compiler-cli": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.0.4.tgz", + "integrity": "sha512-FV010O6GAldRe5sr+qegHe7oLinTylES70NX+0PIp44/W4tPx75Zvop+FVT90I4xPcvFvteLemy8nFAnMK+x5g==", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "^16.1.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==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "@angular/core": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.0.4.tgz", + "integrity": "sha512-860cTMjdCHcvEsHOsTzpg5rThxwVgtnY4yT0SgboWiphrlzX+aNoyN/cCJHxWhmOTRlrl6/+hkeRq95E2BZkKw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/forms": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.0.4.tgz", + "integrity": "sha512-Fhfc4buwMZk0WumDvl/X7XBnOKFeTRTJrwKdi8LlhY6o1Og8H4e/f69u9iDJCF3YjU4qC6yGtPp9YpSVCPP7Ew==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/language-service": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.0.4.tgz", + "integrity": "sha512-KtQxVSlZi3SwZEN4E56KHkNTFEYa3FPZfLJFm6WD1dSobFyMwJgvztO08GWSaT4S0ht0NNRD2IRt0XzBYuZkag==", + "dev": true + }, + "@angular/platform-browser": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.0.4.tgz", + "integrity": "sha512-+uUCKJgspSghJ3R6Fk0XHA0tolbaRBi8JFS2cY+hi9s27WKB88peGvtsK6RCOPJONY6JdOuhpcZqRN8dKfPi7w==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/platform-browser-dynamic": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.4.tgz", + "integrity": "sha512-ZOWTZaFfZSHhMy7a0RIxipiZoiobHWrGlq8/YaMrIgzUb9Fv518FeFCCI68BP0/GuyxX74MJmzv4ZgQctKKxXw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@angular/router": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.0.4.tgz", + "integrity": "sha512-B0sqv8zMM6j88+udEZzO8wKBw61pHgWZmLopnAqA65rRPrAvMsvAHUnYqX6w5pYqhJQxCVLVeKM+0QlQh1+WnA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "dev": true, + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "@babel/generator": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.0.tgz", + "integrity": "sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw==", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -784,6 +1959,189 @@ } } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@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==", + "dev": true, + "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.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@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==", + "dev": true, + "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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "@babel/helper-create-regexp-features-plugin": { "version": "7.8.8", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", @@ -937,6 +2295,40 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@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==", + "dev": true + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -952,6 +2344,12 @@ "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", @@ -1011,6 +2409,24 @@ "@babel/plugin-syntax-async-generators": "^7.8.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-proposal-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", @@ -1021,6 +2437,24 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", @@ -1031,6 +2465,24 @@ "@babel/plugin-syntax-json-strings": "^7.8.0" } }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", @@ -1081,6 +2533,24 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.8.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", @@ -1100,6 +2570,23 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1109,6 +2596,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@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", @@ -1118,6 +2614,23 @@ "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@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", @@ -1430,6 +2943,74 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-transform-runtime": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "@babel/plugin-transform-shorthand-properties": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", @@ -1477,6 +3058,23 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@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==", + "dev": true + } + } + }, "@babel/plugin-transform-unicode-regex": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", @@ -2030,16 +3628,16 @@ "dev": true }, "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", - "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", "dev": true, "requires": { "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.1", - "loader-utils": "^1.4.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.4" + "schema-utils": "^2.7.0" }, "dependencies": { "big.js": { @@ -2055,433 +3653,823 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" } } } }, "@material/animation": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-0.34.0.tgz", - "integrity": "sha512-HKWU+pHda+xSIV0lwrTMOb/N005NIAV7+tvEEjTiLrQx74eO6J9nIjfCpZ0W4D8Kb9K90lgHFo0ZRC6yDTjizQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-5.1.0.tgz", + "integrity": "sha512-qZuPCZkTsCQCzx5EtY2eNBcmYOMGMbFVq6VTmvQztDCYDykT8JfP8Hpk55Y5bGORHvBbIasUXzoAhfQs6w/Bdg==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } }, "@material/auto-init": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-0.35.0.tgz", - "integrity": "sha512-mrd6pZqPNdkuD78VwYhbgCrMob3Ws1rFttYunME+IcJzLeJWOtLLGe4xZe0kYrJJ6e0AZAEA+azLyokOwPQ3Fw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-5.1.0.tgz", + "integrity": "sha512-yal8Bo1cxGclFmXqg9l77PE34g1B3JS+YLBeGeZGXMsKrMcFV4105aipRPYujdKJsUS5eBFeskinJtOIo+gtUw==", + "requires": { + "@material/base": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } }, "@material/base": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-0.35.0.tgz", - "integrity": "sha512-PYuluVzcH8hxtionVvpTSygTENlgyOHvJ5ka7JfbCRQfXlxjV8zKYwhh9u/1HqA6y1OonG1oGFCaBHopbdsNEQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-5.1.0.tgz", + "integrity": "sha512-UxVFKpSNaoKqd7hHxy9hrvwANp0WJy/BZqu8Rj/aRvKnBZnuHehFuOysI9WqdeTqgveJaQoj6EEkVEqLurR5Sg==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } }, "@material/button": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-0.37.0.tgz", - "integrity": "sha512-R0fpPCpl0dh3lbYbAK18tTx/rUAzUBihpRI+uh+//q2snPkZjG57F69zpl5UqA54KpzgFwbui/UFeA/prm+EbQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-5.1.0.tgz", + "integrity": "sha512-umeuIEbeRRd0cY+5axhrBoM0dvJ4YfoTsUbKgz4ctFxHLBsgthFUIXSa3Ot15s284UP6kjslK0LCMqzhirZxeQ==", "requires": { - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/density": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, "@material/card": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-0.37.0.tgz", - "integrity": "sha512-pBTomsmvPY07/Ecue74JvZjZ1k5uFo03X7jWU0ZYIULqdjq2PUQSDrz7KmZ6NVJhjOpquwsnqpZj1pnFLzpe9w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-5.1.0.tgz", + "integrity": "sha512-/syao6oR/PAvzs04quybeCWHZVn4W2dNnxIOWIJTRQced0/o3gYrHgQSX+edC+6pEnSr3Drwbo2cye7nRdbixA==", "requires": { - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0" } }, "@material/checkbox": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-0.37.0.tgz", - "integrity": "sha512-rQS1n63uVcKOTrrJ2S2NTq7MB3obGN/rD/tu5H62lXRoQcZq6MR16hU90ClX1DFpIqmJQAT9ONkx9by6FCmU9w==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-5.1.0.tgz", + "integrity": "sha512-NwpWxFdWrZNlSjcSEEcGz8UN7ZQ5k8VthExclJnawpYGPUnCPLTXWogREnA2Tyl22PJ6jOy8Ejb8tnpu2rSiaw==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/chips": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-0.37.0.tgz", - "integrity": "sha512-16VL8f6VMLplHVStrI10JTJOVqVVXK9QI12BX+3LNLu44h/LUmxG4ovXIb0L3QTiBF8Nv5D6FK/PO/msRAs9YQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/checkbox": "^0.37.0", - "@material/ripple": "^0.37.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-5.1.0.tgz", + "integrity": "sha512-eYWrobENtXbnGoEx5BEURqoCfoc9aHu1JWq64mF12a/JSk+c035KYMjD4oyhow7dYqobbfQlWWdLQeHoRpYCeA==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/data-table": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-5.1.0.tgz", + "integrity": "sha512-vjijTvCHM7sfyPzQ05026nSWT1Bn/3lfj1u0oeYRnym6Ke6Os36x+IF/jFhjsraXKb2we6cof7OdoMFHCU8cqQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, + "@material/density": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-5.1.0.tgz", + "integrity": "sha512-jmp6AgiNYosl+HicxWCa8vib9pg9tNxRcf+6f9LDkDYJ9jtO90PXuypyd0hO64JZ9Df7BywFj5hTWPERG1FBbw==" + }, "@material/dialog": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-0.37.0.tgz", - "integrity": "sha512-Xnvnsbg6qOll+I+vNQvN+Rxk09JtwC8Q2UXByuIKkDVMBeOfVUKsdlw07GuH+A5yGhonV9dHP32FZUI5NHaAZA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-5.1.0.tgz", + "integrity": "sha512-CxA0W0uzXuwJNivB6Gbb7DvtJL3+J7ghsaSL1HfycXVXfdrT1nSidLyOIthRMVBUBJrAMfusvtzFDgXr0TWqDg==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/dom": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-5.1.0.tgz", + "integrity": "sha512-tBbl3hG34Auv+2sboWhtstXeZ9rx3G7hb/jEXs5xZ5KIfZHwY4mbo0KqR/fSJZKaUsvk2Nc/UEOVcUx2mTNmYg==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0", - "focus-trap": "^2.3.0" + "tslib": "^1.9.3" }, "dependencies": { - "focus-trap": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.6.tgz", - "integrity": "sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg==", - "requires": { - "tabbable": "^1.0.3" - } - }, - "tabbable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.3.tgz", - "integrity": "sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg==" + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "@material/drawer": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-0.36.1.tgz", - "integrity": "sha512-Y9vCu3M4RTAGiCstksMr7PyBs0TeM8w0bfulkqJkr49V5gJOCRTyf2lzmBNq3BhsB14LZ5f7MpI242VW/04cgg==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-5.1.0.tgz", + "integrity": "sha512-Xh/kYkT8QWWXkbCI25ys6av0wrc0wXRfvnRdH34Rz4sZvWC51D6apK2bxGr+AV/uR88zwn6U8pb9cccnr+2Eqw==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/list": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/elevation": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-0.36.1.tgz", - "integrity": "sha512-kh7paJc3jc+6O6Op93j8S/eFqiA9KhSsT/gtQeVbEt2ebGweh4TTc/Smm0D/RPOzifPL1mRMAQY7SgFchlz1AQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-5.1.0.tgz", + "integrity": "sha512-NsWIT+L6x3BLouCOh3H8x885/nCrNNmzCwHEodz/0PcYQsxx9RiIVFkagmJWw/w//jej/D4NotD0xHGKOWTrFA==", "requires": { - "@material/animation": "^0.34.0", - "@material/theme": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0" } }, "@material/fab": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-0.37.0.tgz", - "integrity": "sha512-i/Fc6VZsxJ6jxY8JgCmfliDHF56BCsEOOVw7/rXIurP0gqyplF4LVETTerxyFGWXqx5owjbYoG8wlwaxNN/aFw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-5.1.0.tgz", + "integrity": "sha512-mq9I0l4hnsMS+Ko/W7e5A8epElIp3H0UFGJzMlZX5VJBWBpfnykj7fLYnVWtyJ+zFgdLv6rpO/307Kto7gi5Pg==", "requires": { - "@material/animation": "^0.34.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/animation": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, + "@material/feature-targeting": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-5.1.0.tgz", + "integrity": "sha512-z3JNWF7lP9WOzw1xBwul/HAOu4qC6EpK/8MkhjLNI9APvdYML82PWS1V0k0MiqA6Jk6uxm8DiVAk9VUqBa9/YA==" + }, "@material/floating-label": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-0.36.0.tgz", - "integrity": "sha512-hou0x0zm4FMbO0Uy9qxN/iyQznWghput+/QXSfyBE9fHE91EDFlZKirUwzmszm4B+Z3guxo04KZu4N4h6byCsg==", - "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-5.1.0.tgz", + "integrity": "sha512-5EwPiBa5A4Q678tNWdkkBGDdSCDzudhVgBtRiA/7xRo4dHXiBxX5bhE+RHrF3ZQyEf6fsShspqwAFkTA1EaplQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/form-field": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-0.37.0.tgz", - "integrity": "sha512-ZpxKoT+UCzp8/aiyTAWrHWCMiqQ8o9aHYVBC8zxy3Gt1W4e5fvxAunG7K8wzs3ADOzhpcPZCABcFrnPtuH7L1Q==", - "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" - } - }, - "@material/grid-list": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/grid-list/-/grid-list-0.36.0.tgz", - "integrity": "sha512-MnF6NY7NmFinz9+7Gh62zNK/AIrDmROPkyPoiMPBMtAdnuC5rqEDg14yIEGvBwdjrLQZ5bp8yTUR8dBsBpZTNg==", - "requires": { - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-5.1.0.tgz", + "integrity": "sha512-gF2YoeCd41fIM7U1v3psEqiUdwbylbzb6BuvmcKmH0OQBP6lnRbLSbgKWldcHx2VyKTdqusu/bv6/NAe/98QiQ==", + "requires": { + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/icon-button": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-0.37.0.tgz", - "integrity": "sha512-zNJ6GIv/oEndC129pnnqSGEH/ctDzDQSevt2MgvSgMJiaAYli2OJNc+niEhZ2+xn1Z8dIKdHmpFkEuWd6QVRNQ==", - "requires": { - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/theme": "^0.35.0" - } - }, - "@material/icon-toggle": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/icon-toggle/-/icon-toggle-0.37.0.tgz", - "integrity": "sha512-N+Yt1QcMPomiNsUFo3teTVYnkZkl2hoSmGEUZho/vEYQHyodYhJWEv/UpVkhKN0UspSf58E3sze2QYRt+byyVg==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-5.1.0.tgz", + "integrity": "sha512-HLdSkqDH1wx5YSBHz8dGEL2BKv8IDqhRul7wea9i9/3RcQz3hb5+OYpq8iiXqpxcVPVlWNud2w1oyvmEXRTdZQ==", + "requires": { + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/image-list": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-0.35.0.tgz", - "integrity": "sha512-n6nCl+icngiAAbOwIInNAFsJ+dgjmts+npG9tNLBvs9twBrJWavtIpkbwnQNtNlc5gBQuBRraCHIUqZ7pDY5zw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-5.1.0.tgz", + "integrity": "sha512-LFl7W8AFp2baFY38BBGVX5C6c/zZoPOsHsRMhVP8jvIH5q1BfUg6SaXkleos6Yxmy+18hdPnVuWdAQ38hhje8Q==", "requires": { - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/feature-targeting": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0" } }, "@material/layout-grid": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-0.34.0.tgz", - "integrity": "sha512-LJ3LHCumfGftl1ihO0LW9JKsnR71nnlvpzhHdUlK6o1GPul+EEUUdOFN1zxI+Ik9iS++1na/Dg8f/1sdQUxj6w==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-5.1.0.tgz", + "integrity": "sha512-6TvPVZE+UGVfmzttbRp0K6SOUvFmYI5W8p966Vztg8dYK122ondRJqMmyFf0SS0CdbrbO+bSW7/S3YkpPNrvAg==" }, "@material/line-ripple": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-0.35.0.tgz", - "integrity": "sha512-0w0kLYo2dGBiR2kgHxybifO7z4UxIYbL55EKOqkg+rG0dC+NkzFoURhjwoll6910EOlS//5UNo1N/u3to3uNjg==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-5.1.0.tgz", + "integrity": "sha512-esf2/ROZl1eVpyGCWPvxMSGVkuIOG5Fm6qufOLp7XIx5IL1O0bsm+bV6cVC4JCCtmNOag4GOBgkKKbkOvp/R6g==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/linear-progress": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-0.35.0.tgz", - "integrity": "sha512-ZU4wZxcJnkiu/jwp4EiwL3A61xuh2sdwthBTuySz1JPeipHUQ3t+lPzD5RwOQQ+akNTgf7q03s94Aaxq8ZUtlA==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-5.1.0.tgz", + "integrity": "sha512-wuBH2Y7psdiG5ubsKCHFWriHv4IqLeUARCmHoHyFsAdW0snwMPzSgb2mbVDiGl5gjWbSDxBsqGjKo5kOl3Vaug==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/progress-indicator": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/list": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-0.37.0.tgz", - "integrity": "sha512-ZkdwVxvMDdu9B6TLQyjxBLTpyi7yBT4JEGI52EM2VtEVXGu4Y7QEjApxZu0qh8gd43qqfeFbdLlp+yXjfU1d9g==", - "requires": { - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-5.1.0.tgz", + "integrity": "sha512-fcHMJLmmtFYeMU8CO9VsXoRRm3/2jhPVMWK3lpuARZxvkNyZqjQG0mGtpWgw4oekerM/B37TGGFmN3R5DSyGcg==", + "requires": { + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/menu": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-0.36.1.tgz", - "integrity": "sha512-Bc1Bga7QPaBTw1+d50hvFth6I4HirBknur1lfOm+VQnLrmmCeHRBtpjT1l2PAgiFHFWu+3SY5HanwynEdFgKYQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-5.1.0.tgz", + "integrity": "sha512-ssJNcbdyLewgL7hnj4C7JeXO3GvV4G2i1//Ych2s+au7AcJ/6/YeTTKhiCkoSpS7pb7axB3dMKwQWor2glec5Q==", + "requires": { + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/list": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/menu-surface": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-5.1.0.tgz", + "integrity": "sha512-8EqkrKP92O4xaPVItz2841OfmuH3zyCclU1iC0NSBa39MwmYt7ML3IEaOXwOzKlcNGOcC7qPeqcpYlUsfMYX3g==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/notched-outline": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-0.35.0.tgz", - "integrity": "sha512-VXng7P2E0FPbhmoe0afSnKmHocrwOxVHSaEnt46lZL0nT4O19JISprgCWrFHblbhq92SrppHdS73PHzxgfI9HQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-5.1.0.tgz", + "integrity": "sha512-mQ3NjJR1jLXnJi6jhs20ftTf0yU1gWpYlyx1GizU0f7pLEqcIrFnw6G+pavcnKqP+JXNkzAQeGbmZvYBQnxokA==", + "requires": { + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/progress-indicator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-5.1.0.tgz", + "integrity": "sha512-+bsiQogKFu42Td8cXpsxX1u2BOyB4erR6NBWMrSWZJNmKM95EFQrQEnr9nxfU94bY47V3UqYtcAY9Y6GgfJyZQ==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/radio": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-0.37.0.tgz", - "integrity": "sha512-hEPp3HlhRn9Yt6B1fw1guz5QyIlUYjDrpvwgwPncyZ2SYqKhp/hb02/58amV3LHbFvgRFJnsSaBY5l5Hbmf3bw==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/selection-control": "^0.37.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-5.1.0.tgz", + "integrity": "sha512-srAchlY1TKkmQAdMHqbP9vLkN7gmiWX6FGzArgKomd6Es8OqF2P3jvPcQizqz4OFYZIMrxARdW6r8QvhG0lZEg==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/touch-target": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/ripple": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-0.37.0.tgz", - "integrity": "sha512-ybK8w1UlzUn6UJLoCqM3steG9q4exVkR6kZdywy2dE+ddGLe0VRQ/TcJYSfZTIQ0sMyfu8io72iscVWY9dDWdg==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-5.1.0.tgz", + "integrity": "sha512-mluIf+HaaCplszp9/MAl178FpfIJWi5hSyQOpF7w8RTzRSaH8J0uwgmn8VeNnwe1TAWio0vQzHrz4iEg2r7Ngw==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/rtl": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-0.36.0.tgz", - "integrity": "sha512-uCMwWGdKG0ooYh1kVINz7vTgSY++9wnvU3kOqjRdfOY+PZHWSa/X/EqRdE9Q1pUFwYlQeU2PXE/Z2dTK/nlziw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-5.1.0.tgz", + "integrity": "sha512-Hij4KJIfjK63HArdQ3K1INMo0MbigDgL0JhjO1VDk5c+iYmYpjDI7wgPLmV5ISCBtenXRWpo1xbBO3uEmtCd4Q==" }, "@material/select": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-0.37.0.tgz", - "integrity": "sha512-9WZS3cXdb5Xy/b0TWt9jNif+S6HvRSLwj6uT8+Ij8/G0q5yjN94yAWi3wMw7bAZyfek0u7ak7WAz/8SxkiUe8g==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/floating-label": "^0.36.0", - "@material/line-ripple": "^0.35.0", - "@material/notched-outline": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-5.1.0.tgz", + "integrity": "sha512-AAXscWDMjpVfO91VYKhxdP8XTyZ6fJFNFEgL0lxccvRqU8qFt5cPQ+7W1IgMWYdrnvHhANa8DLTrpnepSq4irQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/menu": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, - "@material/selection-control": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/selection-control/-/selection-control-0.37.0.tgz", - "integrity": "sha512-HG5jzNAVVu/ZbtQaiPzZreXovZJ0WpuiQHWMsfmJybjfhC/ZBT2xjvDZJEQXZLunYXeOJPKKh3In6E+U0w5XDg==", + "@material/shape": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-5.1.0.tgz", + "integrity": "sha512-/k27T9fhQ1zj7VCsS26nv0TzsOi142ncik2mycEXq8753PDBotob7Y19pbwivwt9QxkglhMGH0EaWdZPzBoQXw==", "requires": { - "@material/ripple": "^0.37.0" + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0" } }, - "@material/shape": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-0.35.0.tgz", - "integrity": "sha512-WMmGLWrqRymMn8gaPybDWRIx7zNurUmaUa/OoxB++HSiLdLZf8hdEffiWLgqc5u97eRpb4IRaIi/jzcPbWxiUw==" - }, "@material/slider": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-0.36.0.tgz", - "integrity": "sha512-WB4j62IzrQgToWrDwe5ssSX/7wUD2cvCNlVkehz0syjUMWLCDv3ZrWTJQhd3K6XE3TjSjtTa5JjhkuezAAr41A==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-5.1.0.tgz", + "integrity": "sha512-3+0kIgqowmUK0AXOC0jvR+8fqFJobdWuthfbuYBV+PFGBa9+zUow6Txf/yrhtCeQ01FHXw2iNeEFXSws+MYP9w==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/snackbar": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-0.36.0.tgz", - "integrity": "sha512-Q5YL/DLa/cBcE8PGU1HGNsb63OoKknjmL4vYvIMlgy+uNljjXoVBg80Kl5sp8RMzf5XiHByeJaSS1XB7g1ynRQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-5.1.0.tgz", + "integrity": "sha512-bn6WydEGKZxq24aZ6BfnLGPbhCww2srOe+mn2W9VJFBfZEh9qnCcya2jHs295pPbzRtDM1b2oR2LiAKBfIBt3A==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/icon-button": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/switch": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-0.36.1.tgz", - "integrity": "sha512-CmpzhrahaHxZzhmRTEEuSjsNeALmlc9x1Roy18G7DtYKfPiBX0lXU8gQNKTPYX1rCeL4O4wp/HexFuFJlCRMGA==", - "requires": { - "@material/animation": "^0.34.0", - "@material/elevation": "^0.36.1", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-5.1.0.tgz", + "integrity": "sha512-cHFzquY8NINZIIaDdA+T3gwBR5V0lRORh6BNq4EBD69GiGQamoz1S8APr5ea1Sodt7Dm1yzkDRbbDO+yoNgR9g==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/tab": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-5.1.0.tgz", + "integrity": "sha512-awur1Yv2QjJ8ghNyZ/oF6MThxczGDdGqimrzcgS0wI04sg2eTiU5Ed6KV3VILVsD9fA8kKR/e5XEh0CXjqhUYQ==", + "requires": { + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/tab-indicator": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/tab-bar": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-5.1.0.tgz", + "integrity": "sha512-zK1Fe+in5cjkNIQH3Z7NiKqz0hNWehgr5e8lO0MxAFoTRodxUw5OhM9rse18c42uW+fItTJeSpLdz7RceENpyw==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/tab": "^5.1.0", + "@material/tab-scroller": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/tab-indicator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-5.1.0.tgz", + "integrity": "sha512-vy/oBsvRQaQ2EscsgFp9xu7tZM6UBECmNxcC1k2eQGhNjy7olkoL9bX/ymiN4xAjQYqvP6BnC3LN3IywvKMTxQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, - "@material/tabs": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/tabs/-/tabs-0.37.0.tgz", - "integrity": "sha512-d6Vo1C9MSuuwBoNXwssWu9G1muFlp9ogZesq9dwZLvzedfZiiA3lcK2XUVXNBibYWkQXSYSiipPYq2ebpOmxdA==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/tab-scroller": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-5.1.0.tgz", + "integrity": "sha512-7b1Ea5tLc0A0iQEWYHXj8jfdJgYFMaaWjs9BOJyPBw7m2PyDnVwPGngPC5RqmxjDdyEeXbtDHsnMLZmjdT5g6A==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/tab": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/textfield": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-0.37.0.tgz", - "integrity": "sha512-r9nCadBIWOBclhEB8j/Ei0wMFNgt0Itqb88/QlAzPl+oEe2QsNWG6D1dXSMhhYWlsRq8BVYNCFU+EomxZW/xfQ==", - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/floating-label": "^0.36.0", - "@material/line-ripple": "^0.35.0", - "@material/notched-outline": "^0.35.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-5.1.0.tgz", + "integrity": "sha512-Vipvw75AXj4G/BGXv3DyrGozbvHxGtcNGig1e5pz1ERvcmZN5epLyGStznxEIZYNf0Q+6O/NwSRxZGgrdI2w8w==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@material/theme": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-0.35.0.tgz", - "integrity": "sha512-jTjRDPKlWVCNnSs4RRe/eq9+F5lFBzxfbuI7klgCR6jTXRMB93jKKKO7k6chgo9l0oObhLh81ao6sq/eV0WFIw==" - }, - "@material/toolbar": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/toolbar/-/toolbar-0.37.0.tgz", - "integrity": "sha512-62rH9K+npoHlrevxkh2nMIB5d+6OLAMCD7uIgJfOuSi9xxIOmSOnGimSUT4uVIVub5uA4HXLgpBC0A1b3So0eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-5.1.0.tgz", + "integrity": "sha512-VoaCYAubn/oEG1/fu/yP4nxAw8sLEphFOGGBJxcPGQoLgQ9qcvibsV3G5H9S6AtmhJxgSGU0JnO9TaiuhQq5zA==", "requires": { - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/feature-targeting": "^5.1.0" } }, "@material/top-app-bar": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-0.37.0.tgz", - "integrity": "sha512-6SZGJyhdxJSs1Mb1peX2mrtK14f2jQzQLazfPc1KkjTZfSYnaRno3i3/HyZvUb5FKOXCRjlxrhejAk9f8dqItw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-5.1.0.tgz", + "integrity": "sha512-ySCUpwIFnCmY/I9/XPs0IPBCvjWzc2NQ7mquG7qQoaUVUqWTNMyL15zG6CeDf2/Nk14mlSRNM4LRPFWenCdJoQ==", + "requires": { + "@material/animation": "^5.1.0", + "@material/base": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/typography": "^5.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@material/touch-target": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-5.1.0.tgz", + "integrity": "sha512-lR3eoL1D0I/hyEK6I7bMFDBy/pE0yYvjYUZtL1vC7+2i54A4FgQ2hwnpQJVaZQXzrHdj6xsXmODphmUsH5gqPA==", "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/elevation": "^0.36.1", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.35.0", - "@material/typography": "^0.35.0" + "@material/base": "^5.1.0", + "@material/feature-targeting": "^5.1.0" } }, "@material/typography": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-0.35.0.tgz", - "integrity": "sha512-7uXybSQToQCgB19RT0Pq47NkXSSojpbccVAObw/7fmfNUTcr3elNc8iPS/f1slYDTDEdyqM7hCreLcfZQK8ATQ==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-5.1.0.tgz", + "integrity": "sha512-yh02koa6JLyPT5u7Zb31kyqhoZoppL0n9FmZK+eHXZcfeDF7ROL0UmtRsEjQxfnCNZRR+FIhAgrzdYxClwH05g==", + "requires": { + "@material/feature-targeting": "^5.1.0", + "@material/theme": "^5.1.0" + } }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -2494,127 +4482,124 @@ } }, "@ngtools/webpack": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0.tgz", - "integrity": "sha512-kQ+1N/F+5tuUXiiaoqJwhcOIM0I93EEvF3xwpTLRm91wl2i8R1261LvsD/uQPrgLrZNGR6eFhFF1Izn2PnIjQA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.0.4.tgz", + "integrity": "sha512-MAV7inQmsMISTnDcXwyRX5oJZx8F7K/tZRLJciQwkM0DqZyq8fI9KDRwBcmYeQ+J0mSJV9LUVdExmpulpkywqw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.4", - "webpack-sources": "1.4.3" + "@angular-devkit/core": "11.0.4", + "enhanced-resolve": "5.3.1", + "webpack-sources": "2.0.1" + }, + "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 + }, + "webpack-sources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", + "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@npmcli/ci-detect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", - "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", - "dev": true - }, - "@npmcli/git": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.1.tgz", - "integrity": "sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "@npmcli/promise-spawn": "^1.1.0", - "mkdirp": "^1.0.3", - "npm-pick-manifest": "^6.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "unique-filename": "^1.1.1", - "which": "^2.0.2" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" }, "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true } } }, - "@npmcli/installed-package-contents": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", - "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1", - "read-package-json-fast": "^1.1.1", - "readdir-scoped-modules": "^1.1.0" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "@npmcli/promise-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz", - "integrity": "sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA==", + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", "dev": true, "requires": { - "infer-owner": "^1.0.4" + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } } }, "@schematics/angular": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0.tgz", - "integrity": "sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.0.4.tgz", + "integrity": "sha512-LwBD9TIoLy9XqqInJvlN4BHtPyJExyeorNiOp6rXb/wafuDbvZ+9kY9GWZTY1auVo5PNKqErfxr74ydA3FFb9g==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0" + "@angular-devkit/core": "11.0.4", + "@angular-devkit/schematics": "11.0.4", + "jsonc-parser": "2.3.1" } }, "@schematics/update": { - "version": "0.901.0", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0.tgz", - "integrity": "sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w==", + "version": "0.1100.4", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1100.4.tgz", + "integrity": "sha512-YwFtgxCQQkYC89IC7dfshyGr0roE6bpp5HgpQLdS/AOjHeZKo7/SPdM0W4ddB+Fml1Fo6v4eFG/Ia9oR7qNv1A==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.0", - "@angular-devkit/schematics": "9.1.0", + "@angular-devkit/core": "11.0.4", + "@angular-devkit/schematics": "11.0.4", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", - "pacote": "11.1.4", - "rxjs": "6.5.4", - "semver": "7.1.3", + "pacote": "9.5.12", + "semver": "7.3.2", "semver-intersect": "1.4.0" }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, "@stackblitz/sdk": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.3.0.tgz", - "integrity": "sha512-dTqbGKHLowJokC+mbjHMH/9mEd0AJCxOXmsfuKGEWOjnVTnxHjJKXL+bL/vxBSjMwBaUFPUNGmHojPPd2OxADQ==" - }, - "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true - }, - "@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==", - "dev": true + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.5.2.tgz", + "integrity": "sha512-rV8HJb7pti8UBROgVUbxc6f1DGxuUpaGCdQvxvHcGecwqqVMB4XAOzeGuk4HkQLmyCrH/9qTbNA6ch4FwQZRDQ==" }, "@types/events": { "version": "3.0.0", @@ -2634,9 +4619,9 @@ } }, "@types/jasmine": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", - "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", + "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", "dev": true }, "@types/jasminewd2": { @@ -2648,22 +4633,51 @@ "@types/jasmine": "*" } }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, "@types/node": { - "version": "13.9.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.5.tgz", - "integrity": "sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw==", + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", + "dev": true + }, + "@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==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, "@types/source-list-map": { @@ -2673,9 +4687,9 @@ "dev": true }, "@types/webpack-sources": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz", - "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", "dev": true, "requires": { "@types/node": "*", @@ -2692,178 +4706,177 @@ } }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -2885,6 +4898,21 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -2896,15 +4924,59 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, "adm-zip": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, "after": { @@ -2923,31 +4995,12 @@ } }, "agentkeepalive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", - "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "aggregate-error": { @@ -2969,10 +5022,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, + "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", @@ -2987,10 +5039,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "alphanum-sort": { "version": "1.0.2", @@ -2999,17 +5050,17 @@ "dev": true }, "angulartics2": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/angulartics2/-/angulartics2-8.3.0.tgz", - "integrity": "sha512-gbInN/QPkR8VeL+4N+RDKjLBmJ2DM1AZgvxdr7Eu4cPRxfl2rNMvwuAUCaC+m1In/QSteWXwDkyuupVrNBd+Gg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/angulartics2/-/angulartics2-10.0.0.tgz", + "integrity": "sha512-ebn4uZb74WtG5S/OI69eY1J1MLyvIOXpUo64nYHAL7nUqp0PSbz+djPSaWsHKu4ga9G8lMmURzfxZ/EY1X+lmg==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.0.0" } }, "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, "ansi-escapes": { @@ -3059,20 +5110,11 @@ } }, "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", + "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -3112,6 +5154,12 @@ "commander": "^2.11.0" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3130,12 +5178,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "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", @@ -3175,12 +5217,6 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -3191,14 +5227,23 @@ } }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "assert": { @@ -3230,12 +5275,10 @@ "dev": true }, "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "^4.14.0" - } + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true }, "async-each": { "version": "1.0.3", @@ -3262,54 +5305,50 @@ "dev": true }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", - "chalk": "^2.4.2", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.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==", + "browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", + "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "electron-to-chromium": { + "version": "1.3.622", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.622.tgz", + "integrity": "sha512-AJT0Fm1W0uZlMVVkkJrcCVvczDuF8tPm3bwzQf5WO8AaASB2hwTRP7B8pU5rqjireH+ib6am8+hH5/QkXzzYKw==", "dev": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "dev": true } } }, @@ -3320,9 +5359,9 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "axobject-query": { @@ -3335,17 +5374,30 @@ } }, "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dev": true, "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -3357,20 +5409,34 @@ "pkg-dir": "^3.0.0" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true } } }, @@ -3451,21 +5517,21 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "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==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "batch": { @@ -3498,9 +5564,9 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "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 }, "blob": { @@ -3525,9 +5591,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "body-parser": { @@ -3554,15 +5620,6 @@ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -3577,18 +5634,18 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "setprototypeof": { @@ -3717,28 +5774,55 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "browserify-zlib": { @@ -3763,9 +5847,9 @@ } }, "browserstack": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", - "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", "dev": true, "requires": { "https-proxy-agent": "^2.2.1" @@ -3788,28 +5872,6 @@ "isarray": "^1.0.0" } }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", @@ -3859,47 +5921,38 @@ "dev": true }, "cacache": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", - "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "dev": true, "requires": { - "chownr": "^1.1.2", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", + "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", + "rimraf": "^3.0.2", "ssri": "^8.0.0", - "tar": "^6.0.1", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, @@ -3920,6 +5973,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -3957,11 +6020,30 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4010,9 +6092,9 @@ "dev": true }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "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", @@ -4022,13 +6104,13 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.5.0" } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "chrome-trace-event": { @@ -4038,6 +6120,14 @@ "dev": true, "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "cipher-base": { @@ -4100,32 +6190,38 @@ } }, "cli-spinners": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", "dev": true }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "is-fullwidth-code-point": { @@ -4135,22 +6231,34 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } } } @@ -4227,20 +6335,51 @@ "dev": true }, "codelyzer": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", - "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", + "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", "dev": true, "requires": { - "app-root-path": "^2.2.1", + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", "aria-query": "^3.0.0", "axobject-query": "2.0.2", "css-selector-tokenizer": "^0.7.1", "cssauron": "^1.4.0", "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", "semver-dsl": "^1.0.1", "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "dependencies": { + "@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "dev": true + }, + "@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "dev": true + } } }, "collection-visit": { @@ -4254,13 +6393,13 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" }, "dependencies": { "color-convert": { @@ -4290,19 +6429,25 @@ "dev": true }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "dev": true, "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==", + "dev": true + }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "combined-stream": { @@ -4326,12 +6471,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -4350,6 +6489,15 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4360,9 +6508,9 @@ }, "dependencies": { "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true } } @@ -4412,15 +6560,6 @@ "utils-merge": "1.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -4515,16 +6654,10 @@ "run-queue": "^1.0.0" }, "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -4548,53 +6681,35 @@ "dev": true }, "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz", + "integrity": "sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==", "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true }, "emojis-list": { "version": "3.0.0", @@ -4602,108 +6717,66 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" + "json5": "^2.1.2" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "yocto-queue": "^0.1.0" } }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", "dev": true }, "core-js-compat": { @@ -4755,9 +6828,9 @@ }, "dependencies": { "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -4772,9 +6845,9 @@ } }, "cpy": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.0.tgz", - "integrity": "sha512-XwlImkjPxMr01qXqC564VD4rfcDQ2eKtYmFlCy0ixsLRJ1cwYVUBh+v47jsQTO1IrmvdjqO813VpDQ0JiTuOdA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.1.tgz", + "integrity": "sha512-vqHT+9o67sMwJ5hUd/BAOYeemkU+MuFRsK2c36Xc3eefQpAsp1kAsyDxEDcc5JS1+y9l/XHPrIsVTcyGGmkUUQ==", "dev": true, "requires": { "arrify": "^2.0.1", @@ -4819,12 +6892,6 @@ "aggregate-error": "^3.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -4834,209 +6901,31 @@ } }, "cpy-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.0.tgz", - "integrity": "sha512-LJhHvFragWvIsJH1kjhzZwGSagukewJZ5nV5yjMc5TILs+Z/CbZSvX0W9t9XC26Mw32j56UHjR3co5kAXaeTwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.1.tgz", + "integrity": "sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg==", "dev": true, "requires": { "cpy": "^8.0.0", - "meow": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "meow": "^6.1.1" } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { @@ -5066,6 +6955,12 @@ "sha.js": "^2.4.8" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -5142,6 +7037,69 @@ "timsort": "^0.3.0" } }, + "css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "css-parse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", @@ -5170,14 +7128,13 @@ "dev": true }, "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "fastparse": "^1.1.2" } }, "css-tree": { @@ -5199,9 +7156,9 @@ } }, "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssauron": { @@ -5297,28 +7254,28 @@ "dev": true }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "source-map": { @@ -5329,15 +7286,6 @@ } } }, - "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" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -5350,6 +7298,16 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -5366,9 +7324,9 @@ } }, "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", "dev": true }, "debug": { @@ -5380,12 +7338,6 @@ "ms": "2.0.0" } }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -5400,6 +7352,14 @@ "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } } }, "decode-uri-component": { @@ -5466,23 +7426,6 @@ } } }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.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 - } - } - }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -5579,12 +7522,6 @@ } } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -5636,16 +7573,6 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -5667,6 +7594,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "dir-glob": { @@ -5743,9 +7678,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", "dev": true } } @@ -5773,18 +7708,18 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" } }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexify": { @@ -5816,10 +7751,13 @@ "dev": true }, "ejs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.1.tgz", - "integrity": "sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw==", - "dev": true + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } }, "electron-to-chromium": { "version": "1.3.380", @@ -5828,9 +7766,9 @@ "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -5840,8 +7778,22 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -5854,13 +7806,23 @@ "dev": true }, "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, - "optional": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, "end-of-stream": { @@ -5873,49 +7835,67 @@ } }, "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", + "base64id": "2.0.0", "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "dev": true } } }, "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", + "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~6.1.0", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { + "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==", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -5924,31 +7904,59 @@ "requires": { "ms": "2.0.0" } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } } } }, "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", + "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true + } } }, "ent": { @@ -5958,9 +7966,9 @@ "dev": true }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true }, "err-code": { @@ -5988,27 +7996,85 @@ } }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-promise": { @@ -6026,6 +8092,22 @@ "es6-promise": "^4.0.3" } }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6055,12 +8137,20 @@ "dev": true }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -6082,15 +8172,15 @@ "dev": true }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, "eventsource": { @@ -6299,18 +8389,18 @@ "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "ms": { @@ -6394,6 +8484,23 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6528,10 +8635,9 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "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-glob": { "version": "2.2.7", @@ -6680,10 +8786,9 @@ } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "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==" }, "fastparse": { "version": "1.1.2", @@ -6691,6 +8796,15 @@ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6725,13 +8839,13 @@ } }, "file-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "dev": true, "requires": { "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" + "schema-utils": "^3.0.0" }, "dependencies": { "big.js": { @@ -6747,9 +8861,9 @@ "dev": true }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -6765,17 +8879,27 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "minimatch": "^3.0.4" } }, "fill-range": { @@ -6844,9 +8968,9 @@ } }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -6894,56 +9018,27 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "focus-trap": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-5.1.0.tgz", - "integrity": "sha512-CkB/nrO55069QAUjWFBpX6oc+9V90Qhgpe6fBWApzruMq5gnlh90Oo7iSSDK7pKiV5ugG6OY2AXM5mxcmL3lwQ==", - "requires": { - "tabbable": "^4.0.0", - "xtend": "^4.0.1" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -7043,9 +9138,9 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, @@ -7055,6 +9150,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -7067,6 +9168,17 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -7103,9 +9215,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "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" @@ -7117,25 +9229,60 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } } } }, @@ -7146,21 +9293,12 @@ "dev": true }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } + "duplexer": "^0.1.2" } }, "handle-thing": { @@ -7176,48 +9314,28 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -7337,13 +9455,39 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "hash.js": { @@ -7363,9 +9507,9 @@ "dev": true }, "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz", + "integrity": "sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==" }, "hmac-drbg": { "version": "1.0.1", @@ -7415,21 +9559,21 @@ "dev": true }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", "dev": true }, "html-escaper": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", - "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "http-deceiver": { @@ -7450,16 +9594,10 @@ "statuses": ">= 1.4.0 < 2" } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -7468,39 +9606,23 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "4", + "debug": "3.1.0" }, "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -7514,6 +9636,117 @@ "is-glob": "^4.0.0", "lodash": "^4.17.11", "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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" + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "http-signature": { @@ -7578,10 +9811,19 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "iferr": { @@ -7591,9 +9833,9 @@ "dev": true }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "ignore-walk": { @@ -7618,31 +9860,13 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { + "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, @@ -7662,6 +9886,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -7703,21 +9933,21 @@ "dev": true }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", - "rxjs": "^6.5.3", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -7730,19 +9960,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7764,12 +9993,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7782,6 +10005,29 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -7803,9 +10049,9 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7824,9 +10070,9 @@ } }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -7838,12 +10084,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -7889,10 +10129,13 @@ } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { "version": "0.2.1", @@ -7925,9 +10168,9 @@ } }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-color-stop": { @@ -7944,6 +10187,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7965,9 +10217,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-descriptor": { @@ -8040,10 +10292,10 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-number": { @@ -8097,19 +10349,13 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { - "has": "^1.0.1" + "has-symbols": "^1.0.1" } }, "is-resolvable": { @@ -8134,10 +10380,13 @@ } }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, "is-typedarray": { "version": "1.0.0", @@ -8164,13 +10413,10 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true }, "isexe": { "version": "2.0.0", @@ -8190,106 +10436,19 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", - "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "compare-versions": "^3.4.0", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "istanbul-lib-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==", "dev": true }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -8304,82 +10463,74 @@ } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "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==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8389,12 +10540,62 @@ } }, "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "jasmine": { @@ -8417,18 +10618,18 @@ } }, "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", "dev": true }, "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-6.0.0.tgz", + "integrity": "sha512-MvTOVoMxDZAftQYBApIlSfKnGMzi9cj351nXeqtnZTuXffPlbONN31+Es7F+Ke4okUeQ2xISukt4U1npfzLVrQ==", "dev": true, "requires": { - "colors": "1.1.2" + "colors": "1.4.0" } }, "jasminewd2": { @@ -8438,11 +10639,12 @@ "dev": true }, "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -8454,9 +10656,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -8471,9 +10673,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8499,9 +10701,9 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", - "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { @@ -8513,8 +10715,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", @@ -8533,6 +10734,12 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -8561,9 +10768,9 @@ } }, "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", "dev": true, "requires": { "lie": "~3.3.0", @@ -8579,59 +10786,233 @@ "dev": true }, "karma": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", - "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", + "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.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==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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==", + "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 + }, + "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==", + "dev": true + }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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": { - "glob": "^7.1.3" + "p-limit": "^2.2.0" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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==", + "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 + }, "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 + }, + "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" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } } } }, @@ -8644,29 +11025,41 @@ "which": "^1.2.1" } }, - "karma-coverage-istanbul-reporter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", - "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", "dev": true, "requires": { - "istanbul-api": "^2.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", "minimatch": "^3.0.4" } }, "karma-jasmine": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.0.3.tgz", - "integrity": "sha512-80iBR8/hLFY2Uw3S2GG6EndWtMCGMJjrCYNwYROWsJFVTjWrRSsLqcA2ye+U3ygW5sjOQo8f+78L8cGUxjC/+A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", "dev": true, "requires": { - "jasmine-core": "^3.5.0" + "jasmine-core": "^3.6.0" + }, + "dependencies": { + "jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + } } }, "karma-jasmine-html-reporter": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz", - "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", "dev": true }, "karma-source-map-support": { @@ -8690,80 +11083,96 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true }, "less": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", - "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", "dev": true, "requires": { - "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", + "native-request": "^1.0.5", "source-map": "~0.6.0", "tslib": "^1.10.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, "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, "optional": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, "less-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", - "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.0.2.tgz", + "integrity": "sha512-7MKlgjnkCf63E3Lv6w2FvAEgLMx3d/tNBExITcanAq7ys5U8VPWT3F6xcRjYmdNfkoQ9udoVFb1r2azSiTnD6w==", "dev": true, "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, @@ -8783,9 +11192,9 @@ } }, "license-webpack-plugin": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz", - "integrity": "sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.1.tgz", + "integrity": "sha512-yhqTmlYIEpZWA122lf6E0G8+rkn0AzoQ1OpzUKKs/lXUqG1plmGnwmkuuPlfggzJR5y6DLOdot/Tv00CC51CeQ==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -8801,6 +11210,12 @@ "immediate": "~3.0.5" } }, + "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=", + "dev": true + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -8827,49 +11242,104 @@ "path-exists": "^3.0.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { - "date-format": "^2.0.0", + "date-format": "^3.0.0", "debug": "^4.1.1", - "flatted": "^2.0.0", + "flatted": "^2.0.1", "rfdc": "^1.1.4", - "streamroller": "^1.0.6" + "streamroller": "^2.2.4" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -8881,9 +11351,9 @@ } }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", "dev": true }, "loose-envify": { @@ -8895,23 +11365,13 @@ "js-tokens": "^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": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "magic-string": { @@ -8954,94 +11414,75 @@ "dev": true }, "make-fetch-happen": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz", - "integrity": "sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { - "agentkeepalive": "^4.1.0", - "cacache": "^15.0.0", - "http-cache-semantics": "^4.0.4", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.1.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" }, "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, "cacache": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", - "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "chownr": "^1.1.2", - "fs-minipass": "^2.0.0", + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", "glob": "^7.1.4", - "infer-owner": "^1.0.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^8.0.0", - "tar": "^6.0.1", - "unique-filename": "^1.1.1" + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "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==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" + "yallist": "^3.0.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "minimist": "^1.2.5" } }, "rimraf": { @@ -9054,42 +11495,22 @@ } }, "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "tar": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", - "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "figgy-pudding": "^3.5.1" } }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", @@ -9106,9 +11527,9 @@ "dev": true }, "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", "dev": true }, "map-visit": { @@ -9121,48 +11542,53 @@ } }, "material-components-web": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-0.37.0.tgz", - "integrity": "sha512-MgvcrriOtjPPJgnr4PAbVEeFabmUuv4U+cSEFbvwY5Au+Krp7B1LW/Z7/+wW9PmfXQJBPICy5Iql6vgB6mPNXw==", - "requires": { - "@material/animation": "^0.34.0", - "@material/auto-init": "^0.35.0", - "@material/base": "^0.35.0", - "@material/button": "^0.37.0", - "@material/card": "^0.37.0", - "@material/checkbox": "^0.37.0", - "@material/chips": "^0.37.0", - "@material/dialog": "^0.37.0", - "@material/drawer": "^0.36.1", - "@material/elevation": "^0.36.1", - "@material/fab": "^0.37.0", - "@material/floating-label": "^0.36.0", - "@material/form-field": "^0.37.0", - "@material/grid-list": "^0.36.0", - "@material/icon-button": "^0.37.0", - "@material/icon-toggle": "^0.37.0", - "@material/image-list": "^0.35.0", - "@material/layout-grid": "^0.34.0", - "@material/line-ripple": "^0.35.0", - "@material/linear-progress": "^0.35.0", - "@material/list": "^0.37.0", - "@material/menu": "^0.36.1", - "@material/notched-outline": "^0.35.0", - "@material/radio": "^0.37.0", - "@material/ripple": "^0.37.0", - "@material/rtl": "^0.36.0", - "@material/select": "^0.37.0", - "@material/selection-control": "^0.37.0", - "@material/shape": "^0.35.0", - "@material/slider": "^0.36.0", - "@material/snackbar": "^0.36.0", - "@material/switch": "^0.36.1", - "@material/tabs": "^0.37.0", - "@material/textfield": "^0.37.0", - "@material/theme": "^0.35.0", - "@material/toolbar": "^0.37.0", - "@material/top-app-bar": "^0.37.0", - "@material/typography": "^0.35.0" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-5.1.0.tgz", + "integrity": "sha512-02P8D749kXZBjnTb16ISwucD2TLiw3j7mbjVnAF4+jNlEuNv1cB1qtXSzsavGpATzgoDU0xvzufrfBUqHIaAVA==", + "requires": { + "@material/animation": "^5.1.0", + "@material/auto-init": "^5.1.0", + "@material/base": "^5.1.0", + "@material/button": "^5.1.0", + "@material/card": "^5.1.0", + "@material/checkbox": "^5.1.0", + "@material/chips": "^5.1.0", + "@material/data-table": "^5.1.0", + "@material/density": "^5.1.0", + "@material/dialog": "^5.1.0", + "@material/dom": "^5.1.0", + "@material/drawer": "^5.1.0", + "@material/elevation": "^5.1.0", + "@material/fab": "^5.1.0", + "@material/feature-targeting": "^5.1.0", + "@material/floating-label": "^5.1.0", + "@material/form-field": "^5.1.0", + "@material/icon-button": "^5.1.0", + "@material/image-list": "^5.1.0", + "@material/layout-grid": "^5.1.0", + "@material/line-ripple": "^5.1.0", + "@material/linear-progress": "^5.1.0", + "@material/list": "^5.1.0", + "@material/menu": "^5.1.0", + "@material/menu-surface": "^5.1.0", + "@material/notched-outline": "^5.1.0", + "@material/radio": "^5.1.0", + "@material/ripple": "^5.1.0", + "@material/rtl": "^5.1.0", + "@material/select": "^5.1.0", + "@material/shape": "^5.1.0", + "@material/slider": "^5.1.0", + "@material/snackbar": "^5.1.0", + "@material/switch": "^5.1.0", + "@material/tab": "^5.1.0", + "@material/tab-bar": "^5.1.0", + "@material/tab-indicator": "^5.1.0", + "@material/tab-scroller": "^5.1.0", + "@material/textfield": "^5.1.0", + "@material/theme": "^5.1.0", + "@material/top-app-bar": "^5.1.0", + "@material/touch-target": "^5.1.0", + "@material/typography": "^5.1.0" } }, "md5.js": { @@ -9200,15 +11626,80 @@ } }, "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, + "meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -9250,115 +11741,14 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "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=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "miller-rabin": { @@ -9369,6 +11759,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "mime": { @@ -9398,39 +11796,64 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz", + "integrity": "sha512-G3yw7/TQaPfkuiR73MDcyiqhyP8SnbmLhUbpC76H+wtQxA6wfKhMCQOCb6wnPK0dQbjORAeOILQqEesg4/wF7A==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", "webpack-sources": "^1.1.0" }, "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -9459,17 +11882,17 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "dependencies": { "arrify": { @@ -9481,20 +11904,12 @@ } }, "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "minipass-collect": { @@ -9506,19 +11921,6 @@ "minipass": "^3.0.0" } }, - "minipass-fetch": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", - "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-pipeline": "^1.2.2", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -9528,50 +11930,23 @@ "minipass": "^3.0.0" } }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "requires": { "minipass": "^3.0.0" } }, "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "mississippi": { @@ -9603,9 +11978,9 @@ } }, "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "move-concurrently": { @@ -9622,16 +11997,10 @@ "run-queue": "^1.0.3" }, "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -9706,6 +12075,13 @@ "to-regex": "^3.0.1" } }, + "native-request": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", + "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", + "dev": true, + "optional": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -9713,9 +12089,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "nested-error-stacks": { @@ -9724,10 +12100,16 @@ "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "ng-inline-svg": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ng-inline-svg/-/ng-inline-svg-10.0.0.tgz", - "integrity": "sha512-gyTOWmVT2F/l6vBMEcqVwebd9dTdGTxdiyVhmo9omRA2PuCjpfdeiNDM6txGEMfMElZy5zygxgTQJzpbJk4GPA==" + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/ng-inline-svg/-/ng-inline-svg-11.0.2.tgz", + "integrity": "sha512-dwYB77PG5V155BwE4HqsY9friZO4HO5kCwylaP+6++X0goRS8NuHJl2PgeI10fDi+ypxbvroUS2xsH+9wflrfg==" }, "nice-try": { "version": "1.0.5", @@ -9735,10 +12117,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-libs-browser": { @@ -9860,10 +12253,13 @@ }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -9874,49 +12270,51 @@ "dev": true }, "npm-package-arg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", - "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", "dev": true, "requires": { - "hosted-git-info": "^3.0.2", + "hosted-git-info": "^3.0.6", "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "dependencies": { "hosted-git-info": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", - "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", "dev": true, "requires": { - "lru-cache": "^5.1.1" + "lru-cache": "^6.0.0" } }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "npm-packlist": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", - "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", - "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", "dev": true, "requires": { "npm-install-checks": "^4.0.0", @@ -9925,27 +12323,76 @@ }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "npm-registry-fetch": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz", - "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", "dev": true, "requires": { - "@npmcli/ci-detect": "^1.0.0", + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", "lru-cache": "^5.1.1", - "make-fetch-happen": "^8.0.2", - "minipass": "^3.0.0", - "minipass-fetch": "^1.1.2", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "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 + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.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==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "npm-run-path": { @@ -10028,16 +12475,37 @@ } }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } }, "object-keys": { "version": "1.0.11", @@ -10067,13 +12535,31 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "object.pick": { @@ -10086,14 +12572,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" }, "dependencies": { @@ -10106,69 +12592,6 @@ "object-keys": "^1.0.12" } }, - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -10208,9 +12631,9 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" @@ -10225,9 +12648,9 @@ } }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", + "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -10251,35 +12674,17 @@ } } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "ora": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", - "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", + "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", "dev": true, "requires": { - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", + "cli-spinners": "^2.4.0", "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", + "log-symbols": "^4.0.0", "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" @@ -10292,19 +12697,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10332,67 +12736,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -10403,9 +12746,9 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -10428,42 +12771,11 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-tmpdir": { "version": "1.0.2", @@ -10471,6 +12783,16 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-all": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", @@ -10487,12 +12809,12 @@ "dev": true }, "p-event": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz", - "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, "requires": { - "p-timeout": "^2.0.1" + "p-timeout": "^3.1.0" } }, "p-filter": { @@ -10550,9 +12872,9 @@ } }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, "requires": { "p-finally": "^1.0.0" @@ -10565,68 +12887,160 @@ "dev": true }, "pacote": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", - "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "dev": true, "requires": { - "@npmcli/git": "^2.0.1", - "@npmcli/installed-package-contents": "^1.0.5", - "@npmcli/promise-spawn": "^1.1.0", - "cacache": "^15.0.0", - "chownr": "^1.1.4", - "fs-minipass": "^2.1.0", + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "minipass": "^3.0.1", - "minipass-fetch": "^1.2.1", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^8.0.0", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "read-package-json-fast": "^1.1.3", - "rimraf": "^2.7.1", - "semver": "^7.1.3", - "ssri": "^8.0.0", - "tar": "^6.0.1", - "which": "^2.0.2" + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { "cacache": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", - "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "chownr": "^1.1.2", - "fs-minipass": "^2.0.0", + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", "glob": "^7.1.4", - "infer-owner": "^1.0.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^8.0.0", - "tar": "^6.0.1", - "unique-filename": "^1.1.1" + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "minipass": "^2.6.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.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==", + "dev": true + }, + "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 + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, "rimraf": { @@ -10639,47 +13053,48 @@ } }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "minipass": "^3.1.1" + "figgy-pudding": "^3.5.1" } }, "tar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", - "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "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" } }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } @@ -10701,15 +13116,31 @@ "readable-stream": "^2.1.5" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -10726,11 +13157,30 @@ } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -10819,10 +13269,16 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -10851,9 +13307,9 @@ "dev": true }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pinkie": { @@ -10889,15 +13345,24 @@ "find-up": "^3.0.0" } }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, "requires": { "async": "^2.6.2", "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "mkdirp": "^0.5.5" }, "dependencies": { "async": { @@ -10910,27 +13375,27 @@ } }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -10942,9 +13407,9 @@ "dev": true }, "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11007,9 +13472,9 @@ } }, "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -11109,40 +13574,113 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - } - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { + } + } + }, + "postcss-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.4.tgz", + "integrity": "sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } } } @@ -11279,6 +13817,47 @@ } } }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, "postcss-normalize-charset": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", @@ -11494,14 +14073,15 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -11536,15 +14116,9 @@ } }, "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "private": { @@ -11571,16 +14145,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -11605,10 +14169,19 @@ } } }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, "protractor": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", - "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", "dev": true, "requires": { "@types/q": "^0.0.32", @@ -11619,13 +14192,13 @@ "glob": "^7.0.3", "jasmine": "2.8.0", "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", "q": "1.4.1", "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6" + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" }, "dependencies": { "@types/q": { @@ -11634,10 +14207,10 @@ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "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 }, "ansi-styles": { @@ -11652,6 +14225,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -11665,6 +14244,43 @@ "supports-color": "^2.0.0" } }, + "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": { + "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" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -11680,6 +14296,22 @@ "rimraf": "^2.2.8" } }, + "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" + } + }, + "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 + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -11694,6 +14326,12 @@ "pinkie-promise": "^2.0.0" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -11718,12 +14356,48 @@ "path-is-inside": "^1.0.1" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-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" + } + }, + "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 + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "q": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "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 + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -11742,29 +14416,111 @@ "source-map": "^0.5.6" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", - "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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": { + "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" + } + }, + "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": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -11791,16 +14547,10 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { @@ -11815,6 +14565,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "pump": { @@ -11851,10 +14609,9 @@ } }, "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer": { "version": "1.20.0", @@ -11931,16 +14688,6 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -11954,15 +14701,15 @@ "dev": true }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "randombytes": { @@ -12036,13 +14783,13 @@ } }, "raw-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", - "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { "big.js": { @@ -12058,23 +14805,34 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -12086,40 +14844,121 @@ "dev": true, "requires": { "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, - "read-package-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", - "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-json-fast": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", - "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "json-parse-even-better-errors": "^2.0.1", - "npm-normalize-package-bin": "^1.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + }, + "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==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-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" + } + }, + "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 + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "readable-stream": { @@ -12137,25 +14976,13 @@ "util-deprecate": "~1.0.1" } }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "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.0.7" + "picomatch": "^2.2.1" } }, "rechoir": { @@ -12167,6 +14994,16 @@ "resolve": "^1.1.6" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -12189,9 +15026,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regenerator-transform": { @@ -12214,6 +15051,12 @@ "safe-regex": "^1.1.0" } }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -12234,66 +15077,22 @@ } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "object-keys": { @@ -12301,6 +15100,18 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } } } }, @@ -12388,18 +15199,18 @@ }, "dependencies": { "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "qs": { @@ -12443,18 +15254,133 @@ "resolve-from": "^3.0.0" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resolve-url-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -12477,6 +15403,36 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, "rfdc": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", @@ -12515,22 +15471,25 @@ } }, "rollup": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", - "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", + "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", "dev": true, "requires": { "fsevents": "~2.1.2" } }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true }, "run-queue": { "version": "1.0.3", @@ -12542,11 +15501,18 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "safe-buffer": { @@ -12567,29 +15533,28 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.26.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz", - "integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", + "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.5.tgz", + "integrity": "sha512-2LqoNPtKkZq/XbXNQ4C64GFEleSEHKv6NPSI+bMC/l+jpEXGJhiRYkAQToO24MR7NU4JRY2RpLpJ/gjo2Uf13w==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" }, "dependencies": { "big.js": { @@ -12605,30 +15570,44 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -12648,13 +15627,14 @@ "dev": true }, "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "select-hose": { @@ -12696,12 +15676,12 @@ } }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -12761,10 +15741,13 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", @@ -12881,9 +15864,9 @@ "dev": true }, "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, "requires": { "glob": "^7.0.0", @@ -12915,9 +15898,9 @@ } }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "smart-buffer": { @@ -13040,27 +16023,33 @@ } }, "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", + "debug": "~4.1.0", + "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, @@ -13071,56 +16060,108 @@ "dev": true }, "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", + "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", + "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "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==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } } } }, "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "~3.1.0", + "debug": "~4.1.0", "isarray": "2.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "isarray": { @@ -13128,17 +16169,24 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" } }, "sockjs-client": { @@ -13156,9 +16204,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -13174,9 +16222,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -13192,51 +16240,26 @@ } }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" + "agent-base": "~4.2.1", + "socks": "~2.3.2" }, "dependencies": { "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "ms": "^2.1.1" + "es6-promisify": "^5.0.0" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -13250,23 +16273,23 @@ "dev": true }, "source-map-explorer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.4.1.tgz", - "integrity": "sha512-aj4C9RzwFUFxmLn27RN4xWgaqRfaTiDjpyg6tOKPsj2muf6gwV7z202M/S/yDNhh7H4t5iYT38BwmM/+2/AoNw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.2.tgz", + "integrity": "sha512-gBwOyCcHPHcdLbgw6Y6kgoH1uLKL6hN3zz0xJcNI2lpnElZliIlmSYAjUVwAWnc7+HscoTyh1ScR7ITtFuEnxg==", "dev": true, "requires": { "btoa": "^1.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "convert-source-map": "^1.7.0", - "ejs": "^3.0.1", + "ejs": "^3.1.5", "escape-html": "^1.0.3", "glob": "^7.1.6", - "gzip-size": "^5.1.1", - "lodash": "^4.17.15", - "open": "^7.0.3", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", "source-map": "^0.7.3", - "temp": "^0.9.1", - "yargs": "^15.3.1" + "temp": "^0.9.4", + "yargs": "^16.2.0" }, "dependencies": { "ansi-regex": { @@ -13276,25 +16299,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13302,14 +16318,14 @@ } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "color-convert": { @@ -13321,37 +16337,12 @@ "color-name": "~1.1.4" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "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" - } - }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -13370,34 +16361,10 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.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" - } - }, - "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 - }, - "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==", + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "source-map": { @@ -13427,18 +16394,18 @@ } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -13446,44 +16413,99 @@ "strip-ansi": "^6.0.0" } }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "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" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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": { @@ -13551,9 +16573,9 @@ "dev": true }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -13564,12 +16586,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -13595,12 +16617,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -13623,9 +16645,9 @@ } }, "speed-measure-webpack-plugin": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", - "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", + "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", "dev": true, "requires": { "chalk": "^2.0.1" @@ -13745,47 +16767,48 @@ "dev": true }, "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.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==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13794,12 +16817,6 @@ } } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -13811,14 +16828,14 @@ "strip-ansi": "^3.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "dependencies": { "define-properties": { @@ -13838,14 +16855,14 @@ } } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "dependencies": { "define-properties": { @@ -13889,14 +16906,23 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "style-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", - "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { "big.js": { @@ -13912,23 +16938,34 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -13958,18 +16995,18 @@ } }, "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "dev": true, "requires": { "css-parse": "~2.0.0", "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.0.0", + "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { @@ -13983,13 +17020,10 @@ } }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "semver": { "version": "6.3.0", @@ -14006,14 +17040,81 @@ } }, "stylus-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.1.tgz", + "integrity": "sha512-apDYJEM5ZpOAWbWInWcsbtI8gHNr/XYVcSY/tWqOUPt7M5tqhtwXVsAkgyiVjhuvw2Yrjq474a9H+g4d047Ebw==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "when": "~3.6.x" + "fast-glob": "^3.2.4", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "supports-color": { @@ -14073,9 +17174,9 @@ "dev": true }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -14093,53 +17194,50 @@ } }, "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", "dev": true }, - "tabbable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", - "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" - }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", "dev": true }, "tar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", - "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", "dev": true, "requires": { - "chownr": "^1.1.3", + "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^3.0.0", - "minizlib": "^2.1.0", + "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "requires": { + "mkdirp": "^0.5.1", "rimraf": "~2.6.2" }, "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -14152,14 +17250,14 @@ } }, "terser": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", - "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", + "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" }, "dependencies": { "commander": { @@ -14169,87 +17267,66 @@ "dev": true }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "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 + } + } } } }, "terser-webpack-plugin": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", - "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "dev": true, "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^4.4.3", + "terser": "^5.3.4", "webpack-sources": "^1.4.3" }, "dependencies": { - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "yocto-queue": "^0.1.0" } }, - "p-map": { + "schema-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", "dev": true, "requires": { - "glob": "^7.1.3" + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "source-map": { @@ -14257,19 +17334,15 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "thenify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", @@ -14311,9 +17384,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -14346,6 +17419,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -14409,14 +17488,6 @@ "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==", - "dev": true - } } }, "tree-kill": { @@ -14425,28 +17496,59 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, "ts-node": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", - "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", "dev": true, "requires": { "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "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-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" + } + } } }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" }, "tslint": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", - "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -14457,10 +17559,10 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.10.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { @@ -14484,49 +17586,28 @@ "supports-color": "^5.3.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -14538,6 +17619,12 @@ "requires": { "has-flag": "^3.0.0" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, @@ -14548,6 +17635,14 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "tty-browserify": { @@ -14571,6 +17666,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", @@ -14594,15 +17695,15 @@ "dev": true }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -14684,23 +17785,23 @@ } }, "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", "dev": true, "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", + "debug": "^4.1.1", + "request": "^2.88.2", "uuid": "^3.0.0" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -14776,10 +17877,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, + "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" } @@ -14824,34 +17924,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -14875,15 +17947,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -14906,66 +17969,22 @@ } }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "object-keys": { @@ -14974,14 +17993,16 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } } } @@ -15052,657 +18073,148 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, - "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", - "dev": true, - "requires": { - "chokidar": "^2.1.8", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "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=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "optional": true, "requires": { - "node-pre-gyp": "*" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { + "normalize-path": { "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "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.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "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", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "remove-trailing-separator": "^1.0.1" } - }, - "strip-json-comments": { + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "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", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "optional": true, "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" + "is-extendable": "^0.1.0" } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "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=", "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "is-extendable": "^0.1.0" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true } } }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, + "optional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -15713,6 +18225,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, + "optional": true, "requires": { "is-extglob": "^2.1.0" } @@ -15724,6 +18237,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, + "optional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -15732,24 +18246,51 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "optional": true }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "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=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, + "optional": true, "requires": { - "is-buffer": "^1.1.5" + "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" } }, "readdirp": { @@ -15757,6 +18298,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -15768,6 +18310,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -15801,44 +18344,36 @@ "requires": { "@types/selenium-webdriver": "^3.0.0", "selenium-webdriver": "^3.0.1" - }, - "dependencies": { - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", - "dev": true - } } }, "webpack": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", - "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^4.3.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "dependencies": { @@ -15848,6 +18383,35 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "cacache": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", @@ -15869,14 +18433,80 @@ "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true + } } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -15888,12 +18518,32 @@ "pkg-dir": "^3.0.0" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -15920,20 +18570,40 @@ "json5": "^1.0.1" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "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" } }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -15959,6 +18629,15 @@ "ajv-keywords": "^3.1.0" } }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -15974,22 +18653,55 @@ "figgy-pudding": "^3.5.1" } }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", "worker-farm": "^1.7.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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -16006,26 +18718,16 @@ "webpack-log": "^2.0.0" }, "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -16040,9 +18742,9 @@ } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -16053,31 +18755,31 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "anymatch": { @@ -16096,634 +18798,105 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "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" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "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=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", - "dev": true, - "optional": true, - "requires": { - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "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.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "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", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "remove-trailing-separator": "^1.0.1" } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "is-extendable": "^0.1.0" } - }, - "strip-json-comments": { + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "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", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "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" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "is-extendable": "^0.1.0" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true } } }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -16779,15 +18952,38 @@ "dev": true, "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=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "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" } }, "ms": { @@ -16842,15 +19038,6 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } } } }, @@ -16862,15 +19049,24 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + } } }, "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.2.0.tgz", + "integrity": "sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { @@ -16892,36 +19088,33 @@ } }, "webpack-subresource-integrity": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.0.tgz", - "integrity": "sha512-GB1kB/LwAWC3CxwcedGhMkxGpNZxSheCe1q+KJP1bakuieAdX/rGHEcf5zsEzhKXpqsGqokgsDoD9dIkr61VDQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.1.tgz", + "integrity": "sha512-uekbQ93PZ9e7BFB8Hl9cFIVYQyQqiXp2ExKk9Zv+qZfH/zHXHrCFAfw1VW0+NqWbTWrs/HnuDrto3+tiPXh//Q==", "dev": true, "requires": { "webpack-sources": "^1.3.0" } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true + "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==" }, "which": { "version": "1.3.0", @@ -16938,10 +19131,10 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, "worker-farm": { @@ -16954,9 +19147,9 @@ } }, "worker-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.2.tgz", - "integrity": "sha512-V+1zSZMOOKk+uBzKyNIODLQLsx59zSIOaI75J1EMS0iR1qy+KQR3y/pQ3T0vIhvPfDFapGRMsoMvQNEL3okqSA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", + "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", "dev": true, "requires": { "loader-utils": "^1.1.0" @@ -16979,14 +19172,12 @@ "dev": true }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "async-limiter": "~1.0.0" } }, "xml2js": { @@ -17018,9 +19209,10 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { "version": "4.0.0", @@ -17029,35 +19221,51 @@ "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "is-fullwidth-code-point": { @@ -17066,35 +19274,50 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "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 + }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "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 + } } }, "yauzl": { @@ -17118,10 +19341,19 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.3.tgz", + "integrity": "sha512-Y4hTHoh4VcxU5BDGAqEoOnOiyT254w6CiHtpQxAJUSMZPyVgdbKf+5R7Mwz6xsPhMIeBXk5rTopRZDpjssTCUg==", + "requires": { + "tslib": "^2.0.0" + } } } } diff --git a/site/package.json b/site/package.json index 7fb5dc6..dcdfb64 100644 --- a/site/package.json +++ b/site/package.json @@ -1,6 +1,6 @@ { "name": "material-demo", - "version": "0.18.1", + "version": "1.0.0", "private": true, "license": "Apache-2.0", "scripts": { @@ -13,57 +13,56 @@ "e2e": "ng e2e" }, "dependencies": { - "@angular/animations": "^9.1.0", - "@angular/common": "^9.1.0", - "@angular/compiler": "^9.1.0", - "@angular/core": "^9.1.0", - "@angular/forms": "^9.1.0", - "@angular/platform-browser": "^9.1.0", - "@angular/platform-browser-dynamic": "^9.1.0", - "@angular/router": "^9.1.0", - "@stackblitz/sdk": "^1.3.0", - "angulartics2": "^8.3.0", + "@angular/animations": "^11.0.4", + "@angular/common": "^11.0.4", + "@angular/compiler": "^11.0.4", + "@angular/core": "^11.0.4", + "@angular/forms": "^11.0.4", + "@angular/platform-browser": "^11.0.4", + "@angular/platform-browser-dynamic": "^11.0.4", + "@angular/router": "^11.0.4", + "@stackblitz/sdk": "^1.5.2", + "angulartics2": "^10.0.0", "bourbon": "^7.0.0", "classlist.js": "^1.1.20150312", - "focus-trap": "^5.1.0", - "highlight.js": "^9.18.1", - "material-components-web": "^0.37.0", - "ng-inline-svg": "^10.0.0", + "highlight.js": "^10.5.0", + "material-components-web": "^5.1.0", + "ng-inline-svg": "^11.0.2", "normalize.css": "^8.0.1", - "rxjs": "^6.5.4", - "source-map-loader": "^0.2.4", + "rxjs": "^6.6.3", + "source-map-loader": "^1.1.3", "to-string-loader": "^1.1.6", - "tslib": "^1.11.1", - "zone.js": "^0.10.3" + "tslib": "^2.0.0", + "zone.js": "^0.11.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.901.0", - "@angular-devkit/build-optimizer": "^0.901.0", - "@angular/cli": "~9.1.0", - "@angular/compiler-cli": "^9.1.0", - "@angular/language-service": "~9.1.0", + "@angular-devkit/build-angular": "^0.1100.4", + "@angular-devkit/build-optimizer": "^0.1100.4", + "@angular/cli": "~11.0.4", + "@angular/compiler-cli": "^11.0.4", + "@angular/language-service": "~11.0.4", "@blox/utils": "^0.7.0", - "@types/jasmine": "^3.5.10", + "@types/jasmine": "^3.6.3", "@types/jasminewd2": "~2.0.3", - "@types/node": "^13.9.5", + "@types/node": "^14.14.22", "bourbon-neat": "^4.0.0", - "codelyzer": "^5.2.2", - "cpy-cli": "^3.1.0", - "jasmine-core": "^3.5.0", - "jasmine-spec-reporter": "^4.2.1", - "karma": "^4.4.1", - "karma-chrome-launcher": "^3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "mkdirp": "^1.0.3", + "codelyzer": "^6.0.0", + "cpy-cli": "^3.1.1", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "^6.0.0", + "karma": "^5.2.3", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "^2.0.3", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.4", + "mkdirp": "^1.0.4", "mz": "^2.7.0", - "protractor": "~5.4.3", + "protractor": "~7.0.0", "rimraf": "^3.0.2", - "shelljs": "^0.8.3", - "source-map-explorer": "^2.4.1", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~3.8.3" + "shelljs": "^0.8.4", + "source-map-explorer": "^2.5.2", + "ts-node": "^9.1.1", + "tslint": "^6.1.3", + "typescript": "~4.0.5" } } diff --git a/site/prerender.conf.json b/site/prerender.conf.json index 02666a6..5e018d0 100644 --- a/site/prerender.conf.json +++ b/site/prerender.conf.json @@ -1,9 +1,10 @@ { "root": "dist", - "template": "material.html", - "seed": "material", + "template": "index.html", + "seed": "/", "bootstrap": "blox-app", "transition": "ng-transition=blox-app", "port": 4000, - "htmlSuffix": ".html" + "htmlSuffix": ".html", + "directoryIndex": "index.html" } \ No newline at end of file diff --git a/site/src/app/app-routing.module.ts b/site/src/app/app-routing.module.ts index 35c7663..4db457a 100644 --- a/site/src/app/app-routing.module.ts +++ b/site/src/app/app-routing.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; +import { Routes, RouterModule, PreloadAllModules } from '@angular/router'; import { IndexComponent, DocsComponent, @@ -21,7 +21,12 @@ const routes: Routes = [ ]; @NgModule({ - imports: [RouterModule.forRoot(routes)], + imports: [RouterModule.forRoot(routes, { + scrollPositionRestoration: 'enabled', + anchorScrolling: 'enabled', + preloadingStrategy: PreloadAllModules, + relativeLinkResolution: 'legacy' + })], exports: [RouterModule] }) export class AppRoutingModule {} diff --git a/site/src/app/app.component.html b/site/src/app/app.component.html index 7c4e594..a739f5e 100644 --- a/site/src/app/app.component.html +++ b/site/src/app/app.component.html @@ -1,27 +1,40 @@ -
    - + -
    +
    diff --git a/site/src/app/components/code.sample/code.sample.component.ts b/site/src/app/components/code.sample/code.sample.component.ts index 506524d..84e85e7 100644 --- a/site/src/app/components/code.sample/code.sample.component.ts +++ b/site/src/app/components/code.sample/code.sample.component.ts @@ -7,8 +7,8 @@ import { AbstractSnippetComponent } from '../snippets/abstract.snippet.component templateUrl: './code.sample.component.html' }) export class CodeSampleComponent implements AfterContentInit { - @ContentChild(AbstractSnippetComponent) snippet; - snippetNames: string[] = []; + @ContentChild(AbstractSnippetComponent) snippet: AbstractSnippetComponent; + readonly snippetNames: string[] = []; active: string; hasSource = false; private _showCode = false; @@ -60,6 +60,13 @@ export class CodeSampleComponent implements AfterContentInit { return this.openStackblitz ? 'edit' : 'hourglass_empty' } + language(source) { + const extension = source.substring(source.lastIndexOf('.') + 1); + if (extension === 'ts') + return 'typescript'; + return extension; + } + stackblitz() { if (this.openStackblitz) this.openStackblitz(); @@ -77,12 +84,21 @@ export class CodeSampleComponent implements AfterContentInit { const focusTrapVersion = packageJson['dependencies']['focus-trap']; const files = { 'angular.json': require('raw-loader!../../../stackblitz.template/angular.json.template').default, + 'tsconfig.json': require('raw-loader!../../../stackblitz.template/tsconfig.json.template').default, 'src/polyfills.ts': require('raw-loader!../../../stackblitz.template/src/polyfills.ts.template').default, 'src/main.ts': require('raw-loader!../../../stackblitz.template/src/main.ts.template').default, 'src/styles.scss': require('raw-loader!../../../stackblitz.template/src/styles.scss.template').default, - 'src/index.html': require('raw-loader!../../../stackblitz.template/src/index.html.template').default, - 'src/app/app.module.ts': require('raw-loader!../../../stackblitz.template/src/app/app.module.ts.template').default + 'src/index.html': require('raw-loader!../../../stackblitz.template/src/index.html.template').default }; + if (this.snippet.options.noBodyMargins) + files['src/styles.scss'] = files['src/styles.scss'].replace('body {', 'body {\n margin: 0;'); + + for (let name in this.snippet.code) { + if (this.snippet.code.hasOwnProperty(name) && name.indexOf('.') !== -1) + files[`src/app/${name}`] = this.snippet.code[name]; + } + if (!files['src/app/app.module.ts']) + files['src/app/app.module.ts'] = require('raw-loader!../../../stackblitz.template/src/app/app.module.ts.template').default; const appTitle = this.elm.nativeElement.querySelector('h3').textContent; const mainSourceName = 'src/app/' + this.snippet.mainImport + '.ts'; const templateSourceName = 'src/app/' + this.snippet.mainImport + '.html'; @@ -91,7 +107,8 @@ export class CodeSampleComponent implements AfterContentInit { if (this.snippet.code['html']) this.addAssets(this.snippet.code['html'], /\ssrc\s*=\s*\"(\/?assets\/[^"]+)\"/g, assets); if (this.snippet.code['scss']) - this.addAssets(this.snippet.code['scss'], /url\s*\(\s*(\/?assets\/[^\)]+)\)/g, assets); + // TODO relative path? + this.addAssets(this.snippet.code['scss'], /url\s*\(\s*([^)]*\/?assets\/[^\)]+)\)/g, assets); for (let file in files) { if (files.hasOwnProperty(file)) @@ -101,13 +118,13 @@ export class CodeSampleComponent implements AfterContentInit { .replace(/\$\{mainComponent\}/g, this.snippet.mainComponent) .replace(/\$\{mainImport\}/g, this.snippet.mainImport) }; - files[mainSourceName] = this.snippet.code['typescript']; - files[templateSourceName] = this.fixAssets(this.snippet.code['html'], 'html', assets); + files[mainSourceName] = this.fixAssetsInTs(this.snippet.code['typescript'], this.snippet.cacheAssets); + files[templateSourceName] = this.fixAssets(this.snippet.code['html'], assets, this.snippet.cacheAssets); if (this.snippet.code['scss']) files[styleSourceName] = this.fixAssets( this.snippet.code['scss'].replace(/\@material/g, '~@material'), - 'scss', - assets).replace(/(\s*)(.*)stackblitz-skip-line(\s*:\s*)?(.*)/g, '$1// skip on stackblitz $2 $4'); + assets, + this.snippet.cacheAssets).replace(/(\s*)(.*)stackblitz-skip-line(\s*:\s*)?(.*)/g, '$1// skip on stackblitz $2 $4'); this.openStackblitz = () => { this.trackViewCode('stackblitz', this.snippet.mainElement); @@ -118,6 +135,7 @@ export class CodeSampleComponent implements AfterContentInit { template: 'angular-cli', tags: ['blox-material', 'material-components-web', 'angular'], dependencies: { + "@angular/animations": angularVersion, "@angular/common": angularVersion, "@angular/compiler": angularVersion, "@angular/core": angularVersion, @@ -150,11 +168,25 @@ export class CodeSampleComponent implements AfterContentInit { } } - fixAssets(code: string, type: 'html' | 'scss', assets: string[]) { + fixAssetsInTs(code: string, cacheAssets: {[key: string]: string}) { + for (let asset of Object.keys(cacheAssets)) { + const requireAsset = `require('!file-loader!${asset}').default`; + const location = `"${document.location.origin}/${cacheAssets[asset]}"`; + code = code.split(requireAsset).join(location); + } + return code; + } + + fixAssets(code: string, assets: string[], cacheAssets: {[key: string]: string}) { for (let asset of assets) { - const path = asset.startsWith('/') ? asset : `/${asset}`; - const location = `${document.location.origin}${path}`; - code = code.split(asset).join(location); + if (cacheAssets[asset]) { + const location = `${document.location.origin}/${cacheAssets[asset]}`; + code = code.split(asset).join(location); + } else { + const path = asset.startsWith('/') ? asset : `/${asset}`; + const location = `${document.location.origin}${path}`; + code = code.split(asset).join(location); + } } return code; } diff --git a/site/src/app/components/directives.demo/abstract.demo.component.ts b/site/src/app/components/directives.demo/abstract.demo.component.ts new file mode 100644 index 0000000..8875a3a --- /dev/null +++ b/site/src/app/components/directives.demo/abstract.demo.component.ts @@ -0,0 +1,25 @@ +import { DOCUMENT } from "@angular/common"; +import { AfterViewInit, Directive, Inject } from "@angular/core"; +import { SafeHtml } from "@angular/platform-browser"; +import { Router } from "@angular/router"; + +@Directive() +export abstract class AbstractDemoComponent implements AfterViewInit { + constructor(public apiDoc: SafeHtml, @Inject(DOCUMENT) private doc: Document, private router: Router) { + } + + ngAfterViewInit() { + // fix anchor links inside the apidocs parts, so that the angular router is used, + // instead of a pull page (re)load for the linked page: + this.doc.querySelector('div.blox-docs-api').querySelectorAll('a[href]').forEach(anchor => { + const href = anchor.getAttribute('href'); + if (href.startsWith('/')) { + anchor.addEventListener('click', (e) => { + this.router.navigateByUrl(href); + e.preventDefault(); + return false; + }); + } + }); + } +} diff --git a/site/src/app/components/directives.demo/button.directives.component.html b/site/src/app/components/directives.demo/button.directives.component.html index 6e350a2..4d1f50b 100644 --- a/site/src/app/components/directives.demo/button.directives.component.html +++ b/site/src/app/components/directives.demo/button.directives.component.html @@ -3,7 +3,7 @@

    Button

    The mdcButton directive creates a material designed button.

    - Buttons & Anchors Demo + Buttons & Anchors diff --git a/site/src/app/components/directives.demo/button.directives.component.ts b/site/src/app/components/directives.demo/button.directives.component.ts index a30ca03..0dc6424 100644 --- a/site/src/app/components/directives.demo/button.directives.component.ts +++ b/site/src/app/components/directives.demo/button.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-button-directives', templateUrl: './button.directives.component.html' }) -export class ButtonDirectivesComponent { +export class ButtonDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/button.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'button'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/button.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/button.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/card.directives.component.html b/site/src/app/components/directives.demo/card.directives.component.html index 7fcd84e..8c0ed79 100644 --- a/site/src/app/components/directives.demo/card.directives.component.html +++ b/site/src/app/components/directives.demo/card.directives.component.html @@ -3,7 +3,7 @@

    Card

    The mdcCard creates a material designed card.

    - Cards Demo + Cards diff --git a/site/src/app/components/directives.demo/card.directives.component.ts b/site/src/app/components/directives.demo/card.directives.component.ts index ed24ca7..0967e1f 100644 --- a/site/src/app/components/directives.demo/card.directives.component.ts +++ b/site/src/app/components/directives.demo/card.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-card-directives', templateUrl: './card.directives.component.html' }) -export class CardDirectivesComponent { +export class CardDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/card.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'card'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/card.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/card.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/checkbox.directives.component.html b/site/src/app/components/directives.demo/checkbox.directives.component.html index 6434661..fa7e3c8 100644 --- a/site/src/app/components/directives.demo/checkbox.directives.component.html +++ b/site/src/app/components/directives.demo/checkbox.directives.component.html @@ -3,7 +3,7 @@

    Checkbox

    The mdcCheckbox directive creates a material designed checkbox.

    - Checkbox Demo + Checkbox diff --git a/site/src/app/components/directives.demo/checkbox.directives.component.ts b/site/src/app/components/directives.demo/checkbox.directives.component.ts index 7f4b474..c07059b 100644 --- a/site/src/app/components/directives.demo/checkbox.directives.component.ts +++ b/site/src/app/components/directives.demo/checkbox.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-checkbox-directives', templateUrl: './checkbox.directives.component.html' }) -export class CheckboxDirectivesComponent { +export class CheckboxDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/checkbox.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'checkbox'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/checkbox.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/checkbox.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/chips.directives.component.html b/site/src/app/components/directives.demo/chips.directives.component.html index 0a7e330..c34a98e 100644 --- a/site/src/app/components/directives.demo/chips.directives.component.html +++ b/site/src/app/components/directives.demo/chips.directives.component.html @@ -2,22 +2,22 @@

    Chips

    Chips are compact elements that allow users to enter information, select a choice, filter content, or trigger an action.

    - Action Chips Demo + Action Chips
    - Choice Chips Demo + Choice Chips
    - Filter Chips Demo + Filter Chips
    - Input Chips Demo + Input Chips diff --git a/site/src/app/components/directives.demo/chips.directives.component.ts b/site/src/app/components/directives.demo/chips.directives.component.ts index 3ee6ba3..228c25b 100644 --- a/site/src/app/components/directives.demo/chips.directives.component.ts +++ b/site/src/app/components/directives.demo/chips.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-chips-directives', templateUrl: './chips.directives.component.html' }) -export class ChipsDirectivesComponent { +export class ChipsDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/chip.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'chips'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/chips.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/chips.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/dialog.directives.component.html b/site/src/app/components/directives.demo/dialog.directives.component.html index 91e8ff6..0860d49 100644 --- a/site/src/app/components/directives.demo/dialog.directives.component.html +++ b/site/src/app/components/directives.demo/dialog.directives.component.html @@ -5,7 +5,7 @@

    Dialog

    a decision.

    - Dialog Demo + Dialog diff --git a/site/src/app/components/directives.demo/dialog.directives.component.ts b/site/src/app/components/directives.demo/dialog.directives.component.ts index bb676de..05e4f83 100644 --- a/site/src/app/components/directives.demo/dialog.directives.component.ts +++ b/site/src/app/components/directives.demo/dialog.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-dialog-directives', templateUrl: './dialog.directives.component.html' }) -export class DialogDirectivesComponent { +export class DialogDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/dialog.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'dialog'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/dialog.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/dialog.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/drawer.directives.component.html b/site/src/app/components/directives.demo/drawer.directives.component.html index d704817..873891e 100644 --- a/site/src/app/components/directives.demo/drawer.directives.component.html +++ b/site/src/app/components/directives.demo/drawer.directives.component.html @@ -1,21 +1,15 @@

    Drawers

    -The mdcDrawer and mdcDrawerContainer directives are used to create different kinds -of drawers. +Different types of navigation drawers can be created with the mdcDrawer directive.

    - Slidable Drawer Demo - + Drawer +
    - Permanent Drawer Demo - - -
    - - Permanent Drawer below Toolbar Demo - + Drawer below Toolbar +
    diff --git a/site/src/app/components/directives.demo/drawer.directives.component.ts b/site/src/app/components/directives.demo/drawer.directives.component.ts index 54b5339..8ca6de9 100644 --- a/site/src/app/components/directives.demo/drawer.directives.component.ts +++ b/site/src/app/components/directives.demo/drawer.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-drawer-directives', templateUrl: './drawer.directives.component.html' }) -export class DrawerDirectivesComponent { +export class DrawerDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/side_navigation.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'drawer'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/drawer.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/drawer.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/elevation.directives.component.html b/site/src/app/components/directives.demo/elevation.directives.component.html index 8f7a25f..bbb6e0c 100644 --- a/site/src/app/components/directives.demo/elevation.directives.component.html +++ b/site/src/app/components/directives.demo/elevation.directives.component.html @@ -5,7 +5,7 @@

    Elevation

    The value should be between 0 (no elevation) and 24 (for 24 dp elevation).

    - Elevation Demo + Elevation diff --git a/site/src/app/components/directives.demo/elevation.directives.component.ts b/site/src/app/components/directives.demo/elevation.directives.component.ts index 4c1d497..a22b3f0 100644 --- a/site/src/app/components/directives.demo/elevation.directives.component.ts +++ b/site/src/app/components/directives.demo/elevation.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-elevation-directives', templateUrl: './elevation.directives.component.html' }) -export class ElevationDirectivesComponent { +export class ElevationDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/shadow.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'elevation'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/elevation.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/elevation.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/fab.directives.component.html b/site/src/app/components/directives.demo/fab.directives.component.html index eb54ed4..6b799de 100644 --- a/site/src/app/components/directives.demo/fab.directives.component.html +++ b/site/src/app/components/directives.demo/fab.directives.component.html @@ -3,7 +3,7 @@

    Floating Action Button

    The mdcFab directive creates a material designed floating action button.

    - Floating Action Button Demo + Floating Action Buttons diff --git a/site/src/app/components/directives.demo/fab.directives.component.ts b/site/src/app/components/directives.demo/fab.directives.component.ts index 0a0511c..2c86269 100644 --- a/site/src/app/components/directives.demo/fab.directives.component.ts +++ b/site/src/app/components/directives.demo/fab.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-fab-directives', templateUrl: './fab.directives.component.html' }) -export class FabDirectivesComponent { +export class FabDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/button.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'fab'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/fab.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/fab.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/focus-trap.directives.component.html b/site/src/app/components/directives.demo/focus-trap.directives.component.html index 7de9894..6419a16 100644 --- a/site/src/app/components/directives.demo/focus-trap.directives.component.html +++ b/site/src/app/components/directives.demo/focus-trap.directives.component.html @@ -7,7 +7,7 @@

    Focus Trap

    used in combination with mdcDialog.

    - Focus Trap Demo + Focus Trap diff --git a/site/src/app/components/directives.demo/focus-trap.directives.component.ts b/site/src/app/components/directives.demo/focus-trap.directives.component.ts index 19773de..7f924bc 100644 --- a/site/src/app/components/directives.demo/focus-trap.directives.component.ts +++ b/site/src/app/components/directives.demo/focus-trap.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-focus-trap-directives', templateUrl: './focus-trap.directives.component.html' }) -export class FocusTrapDirectivesComponent { +export class FocusTrapDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/dialog.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'focus-trap'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/focus-trap.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/focus-trap.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/icon-button.directives.component.html b/site/src/app/components/directives.demo/icon-button.directives.component.html index 80cc079..c43b7b1 100644 --- a/site/src/app/components/directives.demo/icon-button.directives.component.html +++ b/site/src/app/components/directives.demo/icon-button.directives.component.html @@ -3,7 +3,7 @@

    Icon Button

    The mdcIconButton directive creates a material designed icon buttons and toggle buttons.

    - Icon Button Demo + Icon Buttons diff --git a/site/src/app/components/directives.demo/icon-button.directives.component.ts b/site/src/app/components/directives.demo/icon-button.directives.component.ts index 9750f82..e65bac5 100644 --- a/site/src/app/components/directives.demo/icon-button.directives.component.ts +++ b/site/src/app/components/directives.demo/icon-button.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-icon-button-directives', templateUrl: './icon-button.directives.component.html' }) -export class IconButtonDirectivesComponent { +export class IconButtonDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/component.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'icon-button'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/icon-button.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/icon-button.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/icon-toggle.directives.component.html b/site/src/app/components/directives.demo/icon-toggle.directives.component.html index 7406df4..d00851d 100644 --- a/site/src/app/components/directives.demo/icon-toggle.directives.component.html +++ b/site/src/app/components/directives.demo/icon-toggle.directives.component.html @@ -3,7 +3,7 @@

    Icon Toggle

    The mdcIconToggle directive creates a material designed icon toggle.

    - Icon Toggle Demo + Icon Toggles diff --git a/site/src/app/components/directives.demo/icon-toggle.directives.component.ts b/site/src/app/components/directives.demo/icon-toggle.directives.component.ts index 477d9d8..8d097db 100644 --- a/site/src/app/components/directives.demo/icon-toggle.directives.component.ts +++ b/site/src/app/components/directives.demo/icon-toggle.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-icon-toggle-directives', templateUrl: './icon-toggle.directives.component.html' }) -export class IconToggleDirectivesComponent { +export class IconToggleDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/component.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'icon-toggle'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/icon-toggle.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/icon-toggle.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/index.ts b/site/src/app/components/directives.demo/index.ts index 02177eb..c47ff89 100644 --- a/site/src/app/components/directives.demo/index.ts +++ b/site/src/app/components/directives.demo/index.ts @@ -1,79 +1,76 @@ -import { ButtonDirectivesComponent } from './button.directives.component'; -import { CardDirectivesComponent } from './card.directives.component'; -import { CheckboxDirectivesComponent } from './checkbox.directives.component'; -import { ChipsDirectivesComponent } from './chips.directives.component'; -import { DialogDirectivesComponent } from './dialog.directives.component'; -import { DrawerDirectivesComponent } from './drawer.directives.component'; -import { ElevationDirectivesComponent } from './elevation.directives.component'; -import { FabDirectivesComponent } from './fab.directives.component'; -import { FocusTrapDirectivesComponent } from './focus-trap.directives.component'; -import { IconButtonDirectivesComponent } from './icon-button.directives.component'; -import { IconToggleDirectivesComponent } from './icon-toggle.directives.component'; -import { LinearProgressDirectivesComponent } from './linear-progress.directives.component'; -import { ListDirectivesComponent } from './list.directives.component'; -import { MenuDirectivesComponent } from './menu.directives.component'; -import { RadioDirectivesComponent } from './radio.directives.component'; -import { RippleDirectivesComponent } from './ripple.directives.component'; -import { SelectDirectivesComponent } from './select.directives.component'; -import { SliderDirectivesComponent } from './slider.directives.component'; -import { SnackbarDirectivesComponent } from './snackbar.directives.component'; -import { SwitchDirectivesComponent } from './switch.directives.component'; -import { TabDirectivesComponent } from './tab.directives.component'; -import { TextFieldDirectivesComponent } from './text-field.directives.component'; -import { ToolbarDirectivesComponent } from './toolbar.directives.component'; -import { TopAppBarDirectivesComponent } from './top-app-bar.directives.component'; -import { UtilityDirectivesComponent } from './utility.directives.component'; - -export * from './button.directives.component'; -export * from './card.directives.component'; -export * from './checkbox.directives.component'; -export * from './chips.directives.component'; -export * from './dialog.directives.component'; -export * from './drawer.directives.component'; -export * from './elevation.directives.component'; -export * from './fab.directives.component'; -export * from './focus-trap.directives.component'; -export * from './icon-button.directives.component'; -export * from './icon-toggle.directives.component'; -export * from './linear-progress.directives.component'; -export * from './list.directives.component'; -export * from './menu.directives.component'; -export * from './radio.directives.component'; -export * from './ripple.directives.component'; -export * from './select.directives.component'; -export * from './slider.directives.component'; -export * from './snackbar.directives.component'; -export * from './switch.directives.component'; -export * from './tab.directives.component'; -export * from './text-field.directives.component'; -export * from './toolbar.directives.component'; -export * from './top-app-bar.directives.component'; -export * from './utility.directives.component'; - -export const MDC_DIRECTIVE_DOC_COMPONENTS = [ - ButtonDirectivesComponent, - CardDirectivesComponent, - CheckboxDirectivesComponent, - ChipsDirectivesComponent, - DialogDirectivesComponent, - DrawerDirectivesComponent, - ElevationDirectivesComponent, - FabDirectivesComponent, - FocusTrapDirectivesComponent, - IconButtonDirectivesComponent, - IconToggleDirectivesComponent, - LinearProgressDirectivesComponent, - ListDirectivesComponent, - MenuDirectivesComponent, - RadioDirectivesComponent, - RippleDirectivesComponent, - SelectDirectivesComponent, - SliderDirectivesComponent, - SnackbarDirectivesComponent, - SwitchDirectivesComponent, - TabDirectivesComponent, - TextFieldDirectivesComponent, - ToolbarDirectivesComponent, - TopAppBarDirectivesComponent, - UtilityDirectivesComponent -] +import { ButtonDirectivesComponent } from './button.directives.component'; +import { CardDirectivesComponent } from './card.directives.component'; +import { CheckboxDirectivesComponent } from './checkbox.directives.component'; +import { ChipsDirectivesComponent } from './chips.directives.component'; +import { DialogDirectivesComponent } from './dialog.directives.component'; +import { DrawerDirectivesComponent } from './drawer.directives.component'; +import { ElevationDirectivesComponent } from './elevation.directives.component'; +import { FabDirectivesComponent } from './fab.directives.component'; +import { FocusTrapDirectivesComponent } from './focus-trap.directives.component'; +import { IconButtonDirectivesComponent } from './icon-button.directives.component'; +import { LinearProgressDirectivesComponent } from './linear-progress.directives.component'; +import { ListDirectivesComponent } from './list.directives.component'; +import { MenuDirectivesComponent } from './menu.directives.component'; +import { MenuSurfaceDirectivesComponent } from './menu-surface.directives.component'; +import { RadioDirectivesComponent } from './radio.directives.component'; +import { RippleDirectivesComponent } from './ripple.directives.component'; +import { SelectDirectivesComponent } from './select.directives.component'; +import { SliderDirectivesComponent } from './slider.directives.component'; +import { SnackbarDirectivesComponent } from './snackbar.directives.component'; +import { SwitchDirectivesComponent } from './switch.directives.component'; +import { TabDirectivesComponent } from './tab.directives.component'; +import { TextFieldDirectivesComponent } from './text-field.directives.component'; +import { TopAppBarDirectivesComponent } from './top-app-bar.directives.component'; +import { UtilityDirectivesComponent } from './utility.directives.component'; + +export * from './button.directives.component'; +export * from './card.directives.component'; +export * from './checkbox.directives.component'; +export * from './chips.directives.component'; +export * from './dialog.directives.component'; +export * from './drawer.directives.component'; +export * from './elevation.directives.component'; +export * from './fab.directives.component'; +export * from './focus-trap.directives.component'; +export * from './icon-button.directives.component'; +export * from './linear-progress.directives.component'; +export * from './list.directives.component'; +export * from './menu.directives.component'; +export * from './menu-surface.directives.component'; +export * from './radio.directives.component'; +export * from './ripple.directives.component'; +export * from './select.directives.component'; +export * from './slider.directives.component'; +export * from './snackbar.directives.component'; +export * from './switch.directives.component'; +export * from './tab.directives.component'; +export * from './text-field.directives.component'; +export * from './top-app-bar.directives.component'; +export * from './utility.directives.component'; + +export const MDC_DIRECTIVE_DOC_COMPONENTS = [ + ButtonDirectivesComponent, + CardDirectivesComponent, + CheckboxDirectivesComponent, + ChipsDirectivesComponent, + DialogDirectivesComponent, + DrawerDirectivesComponent, + ElevationDirectivesComponent, + FabDirectivesComponent, + FocusTrapDirectivesComponent, + IconButtonDirectivesComponent, + LinearProgressDirectivesComponent, + ListDirectivesComponent, + MenuDirectivesComponent, + MenuSurfaceDirectivesComponent, + RadioDirectivesComponent, + RippleDirectivesComponent, + SelectDirectivesComponent, + SliderDirectivesComponent, + SnackbarDirectivesComponent, + SwitchDirectivesComponent, + TabDirectivesComponent, + TextFieldDirectivesComponent, + TopAppBarDirectivesComponent, + UtilityDirectivesComponent +] diff --git a/site/src/app/components/directives.demo/linear-progress.directives.component.html b/site/src/app/components/directives.demo/linear-progress.directives.component.html index 8759941..d2fdd84 100644 --- a/site/src/app/components/directives.demo/linear-progress.directives.component.html +++ b/site/src/app/components/directives.demo/linear-progress.directives.component.html @@ -4,7 +4,7 @@

    Linear Progress

    - Linear Progress Demo + Linear Progress diff --git a/site/src/app/components/directives.demo/linear-progress.directives.component.ts b/site/src/app/components/directives.demo/linear-progress.directives.component.ts index aa89abd..7d40604 100644 --- a/site/src/app/components/directives.demo/linear-progress.directives.component.ts +++ b/site/src/app/components/directives.demo/linear-progress.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-linear-progress-directives', templateUrl: './linear-progress.directives.component.html' }) -export class LinearProgressDirectivesComponent { +export class LinearProgressDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/progress_linear.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'linear-progress'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/linear-progress.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/linear-progress.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/list.directives.component.html b/site/src/app/components/directives.demo/list.directives.component.html index 99f0fc7..483a5d0 100644 --- a/site/src/app/components/directives.demo/list.directives.component.html +++ b/site/src/app/components/directives.demo/list.directives.component.html @@ -3,12 +3,12 @@

    List

    Directives for creating material designed lists and list-groups.

    - Single Line List Demo + Single Line List
    - Two Line List Demo + Two Line List diff --git a/site/src/app/components/directives.demo/list.directives.component.ts b/site/src/app/components/directives.demo/list.directives.component.ts index 66c0462..346d2c5 100644 --- a/site/src/app/components/directives.demo/list.directives.component.ts +++ b/site/src/app/components/directives.demo/list.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-list-directives', templateUrl: './list.directives.component.html' }) -export class ListDirectivesComponent { +export class ListDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/list.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'list'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/list.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/list.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/menu-surface.directives.component.html b/site/src/app/components/directives.demo/menu-surface.directives.component.html new file mode 100644 index 0000000..d089160 --- /dev/null +++ b/site/src/app/components/directives.demo/menu-surface.directives.component.html @@ -0,0 +1,9 @@ +

    Menu Surface

    +

    Menu Surfaces (`mdcMenuSurface`) are reusable surfaces that appear above the content of the page + when in view. They can be positioned adjacent to an element that triggers the activation (e.g. the + provided `mdcMenuAnchor` directive).

    +

    Menu Surfaces are used by mdcMenu, and + mdcSelectMenu. But they can also be used + on their own.

    + +
    diff --git a/site/src/app/components/directives.demo/menu-surface.directives.component.ts b/site/src/app/components/directives.demo/menu-surface.directives.component.ts new file mode 100644 index 0000000..b95c311 --- /dev/null +++ b/site/src/app/components/directives.demo/menu-surface.directives.component.ts @@ -0,0 +1,24 @@ +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; + +@Component({ + selector: 'blox-menu-surface-directives', + templateUrl: './menu-surface.directives.component.html' +}) +export class MenuSurfaceDirectivesComponent extends AbstractDemoComponent { + static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/menu.svg'); + static DOC_TYPE = 'components'; + static DOC_HREF = 'menu-surface'; + apiDoc: SafeHtml; + + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/menu-surface.html').default), + doc, + router + ); + } +} diff --git a/site/src/app/components/directives.demo/menu.directives.component.html b/site/src/app/components/directives.demo/menu.directives.component.html index 9840338..3de9740 100644 --- a/site/src/app/components/directives.demo/menu.directives.component.html +++ b/site/src/app/components/directives.demo/menu.directives.component.html @@ -13,7 +13,7 @@

    Accessibility

    - Menu Demo + Menu diff --git a/site/src/app/components/directives.demo/menu.directives.component.ts b/site/src/app/components/directives.demo/menu.directives.component.ts index 813f277..9c22525 100644 --- a/site/src/app/components/directives.demo/menu.directives.component.ts +++ b/site/src/app/components/directives.demo/menu.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-menu-directives', templateUrl: './menu.directives.component.html' }) -export class MenuDirectivesComponent { +export class MenuDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/menu.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'menu'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/menu.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/menu.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/radio.directives.component.html b/site/src/app/components/directives.demo/radio.directives.component.html index e7b82b8..32d0b19 100644 --- a/site/src/app/components/directives.demo/radio.directives.component.html +++ b/site/src/app/components/directives.demo/radio.directives.component.html @@ -3,7 +3,7 @@

    Radio buttons

    The mdcRadio directive creates material designed radio buttons.

    - Radio Button Demo + Radio Button diff --git a/site/src/app/components/directives.demo/radio.directives.component.ts b/site/src/app/components/directives.demo/radio.directives.component.ts index 3983fed..16e201b 100644 --- a/site/src/app/components/directives.demo/radio.directives.component.ts +++ b/site/src/app/components/directives.demo/radio.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-radio-directives', templateUrl: './radio.directives.component.html' }) -export class RadioDirectivesComponent { +export class RadioDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/radio.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'radio'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/radio.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/radio.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/ripple.directives.component.html b/site/src/app/components/directives.demo/ripple.directives.component.html index 1a8cd68..deef2f2 100644 --- a/site/src/app/components/directives.demo/ripple.directives.component.html +++ b/site/src/app/components/directives.demo/ripple.directives.component.html @@ -3,7 +3,7 @@

    Ripple

    The mdcRipple directive creates a configurable ripple surface.

    - Ripple Demo + Ripple diff --git a/site/src/app/components/directives.demo/ripple.directives.component.ts b/site/src/app/components/directives.demo/ripple.directives.component.ts index 123b1d3..bbcc2ee 100644 --- a/site/src/app/components/directives.demo/ripple.directives.component.ts +++ b/site/src/app/components/directives.demo/ripple.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-ripple-directives', templateUrl: './ripple.directives.component.html' }) -export class RippleDirectivesComponent { +export class RippleDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/ripple.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'ripple'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/ripple.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/ripple.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/select.directives.component.html b/site/src/app/components/directives.demo/select.directives.component.html index 2278d19..7e7949e 100644 --- a/site/src/app/components/directives.demo/select.directives.component.html +++ b/site/src/app/components/directives.demo/select.directives.component.html @@ -9,7 +9,7 @@

    Accessibility

    and its items

    - Select Demo + Select Input diff --git a/site/src/app/components/directives.demo/select.directives.component.ts b/site/src/app/components/directives.demo/select.directives.component.ts index 78f79a5..39be33a 100644 --- a/site/src/app/components/directives.demo/select.directives.component.ts +++ b/site/src/app/components/directives.demo/select.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-select-directives', templateUrl: './select.directives.component.html' }) -export class SelectDirectivesComponent { +export class SelectDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/menu.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'select'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/select.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/select.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/slider.directives.component.html b/site/src/app/components/directives.demo/slider.directives.component.html index 44cf9cc..b05b874 100644 --- a/site/src/app/components/directives.demo/slider.directives.component.html +++ b/site/src/app/components/directives.demo/slider.directives.component.html @@ -11,7 +11,7 @@

    Accessibility

    - Slider Demo + Slider diff --git a/site/src/app/components/directives.demo/slider.directives.component.ts b/site/src/app/components/directives.demo/slider.directives.component.ts index 86e51d4..a09c46d 100644 --- a/site/src/app/components/directives.demo/slider.directives.component.ts +++ b/site/src/app/components/directives.demo/slider.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-slider-directives', templateUrl: './slider.directives.component.html' }) -export class SliderDirectivesComponent { +export class SliderDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/slider.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'slider'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/slider.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/slider.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/snackbar.directives.component.html b/site/src/app/components/directives.demo/snackbar.directives.component.html index 695e4f7..287400d 100644 --- a/site/src/app/components/directives.demo/snackbar.directives.component.html +++ b/site/src/app/components/directives.demo/snackbar.directives.component.html @@ -6,7 +6,7 @@

    Snackbar

    - Buttons & Anchors Demo + Snackbar Service diff --git a/site/src/app/components/directives.demo/snackbar.directives.component.ts b/site/src/app/components/directives.demo/snackbar.directives.component.ts index 2a4ffa9..41764d5 100644 --- a/site/src/app/components/directives.demo/snackbar.directives.component.ts +++ b/site/src/app/components/directives.demo/snackbar.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-snackbar-directives', templateUrl: './snackbar.directives.component.html' }) -export class SnackbarDirectivesComponent { +export class SnackbarDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/snackbar.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'snackbar'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/snackbar.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/snackbar.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/switch.directives.component.html b/site/src/app/components/directives.demo/switch.directives.component.html index b7ad730..4cb7f9a 100644 --- a/site/src/app/components/directives.demo/switch.directives.component.html +++ b/site/src/app/components/directives.demo/switch.directives.component.html @@ -3,7 +3,7 @@

    Checkbox

    The mdcSwitch directive creates a material designed switch.

    - Switch Demo + Switch Input diff --git a/site/src/app/components/directives.demo/switch.directives.component.ts b/site/src/app/components/directives.demo/switch.directives.component.ts index 1c20813..dd42055 100644 --- a/site/src/app/components/directives.demo/switch.directives.component.ts +++ b/site/src/app/components/directives.demo/switch.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-switch-directives', templateUrl: './switch.directives.component.html' }) -export class SwitchDirectivesComponent { +export class SwitchDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/switch.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'switch'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/switch.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/switch.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/tab.directives.component.html b/site/src/app/components/directives.demo/tab.directives.component.html index cd745cd..3e39b90 100644 --- a/site/src/app/components/directives.demo/tab.directives.component.html +++ b/site/src/app/components/directives.demo/tab.directives.component.html @@ -3,22 +3,22 @@

    Tabs

    Tabbed navigation components

    - Tabs Demo + Tabs
    - Routed Tabs Demo - + Tabs with Router +
    - Tabs with Icons Demo + Tabs with Icons
    - Tab with Scroller Demo + Tab with Scroller diff --git a/site/src/app/components/directives.demo/tab.directives.component.ts b/site/src/app/components/directives.demo/tab.directives.component.ts index 6745595..3d85e96 100644 --- a/site/src/app/components/directives.demo/tab.directives.component.ts +++ b/site/src/app/components/directives.demo/tab.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-tab-directives', templateUrl: './tab.directives.component.html' }) -export class TabDirectivesComponent { +export class TabDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/tabs.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'tabs'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/tabs.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/tab.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/text-field.directives.component.html b/site/src/app/components/directives.demo/text-field.directives.component.html index 4ad83af..1fc9a03 100644 --- a/site/src/app/components/directives.demo/text-field.directives.component.html +++ b/site/src/app/components/directives.demo/text-field.directives.component.html @@ -3,19 +3,19 @@

    Text Fields

    A text-field is composed of a label, input element, line, helper text, and possibly a leading or trailing icon.

    - Text Field Demo + Text Fields
    - Text Field with Icon Demo + Text Fields with Icons
    - Text Area Demo + Text Areas diff --git a/site/src/app/components/directives.demo/text-field.directives.component.ts b/site/src/app/components/directives.demo/text-field.directives.component.ts index 29176e0..75e72f7 100644 --- a/site/src/app/components/directives.demo/text-field.directives.component.ts +++ b/site/src/app/components/directives.demo/text-field.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-text-field-directives', templateUrl: './text-field.directives.component.html' }) -export class TextFieldDirectivesComponent { +export class TextFieldDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/text-field.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'text-field'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/text-field.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/text-field.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/toolbar.directives.component.html b/site/src/app/components/directives.demo/toolbar.directives.component.html deleted file mode 100644 index 6c42981..0000000 --- a/site/src/app/components/directives.demo/toolbar.directives.component.html +++ /dev/null @@ -1,16 +0,0 @@ -

    Toolbars

    -

    The mdcToolbar directive

    - -

    Default toolbar:

    - - Toolbar Demo - - - -

    Flexible toolbar:

    - - Flexible Toolbar Demo - - - -
    diff --git a/site/src/app/components/directives.demo/toolbar.directives.component.ts b/site/src/app/components/directives.demo/toolbar.directives.component.ts deleted file mode 100644 index 621df97..0000000 --- a/site/src/app/components/directives.demo/toolbar.directives.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -@Component({ - selector: 'blox-toolbar-directives', - templateUrl: './toolbar.directives.component.html' -}) -export class ToolbarDirectivesComponent { - static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/toolbar.svg'); - static DOC_TYPE = 'components'; - static DOC_HREF = 'toolbar'; - apiDoc: SafeHtml; - - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/toolbar.html').default); - } -} diff --git a/site/src/app/components/directives.demo/top-app-bar.directives.component.html b/site/src/app/components/directives.demo/top-app-bar.directives.component.html index ad4207e..a01983f 100644 --- a/site/src/app/components/directives.demo/top-app-bar.directives.component.html +++ b/site/src/app/components/directives.demo/top-app-bar.directives.component.html @@ -2,7 +2,7 @@

    Top App Bar

    The mdcTopAppBar directive

    - Top App Bar Demo + Top App Bar diff --git a/site/src/app/components/directives.demo/top-app-bar.directives.component.ts b/site/src/app/components/directives.demo/top-app-bar.directives.component.ts index 5494e55..b2f0fcb 100644 --- a/site/src/app/components/directives.demo/top-app-bar.directives.component.ts +++ b/site/src/app/components/directives.demo/top-app-bar.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-top-app-bar-directives', templateUrl: './top-app-bar.directives.component.html' }) -export class TopAppBarDirectivesComponent { +export class TopAppBarDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/toolbar.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'top-app-bar'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/top-app-bar.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/top-app-bar.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/directives.demo/utility.directives.component.ts b/site/src/app/components/directives.demo/utility.directives.component.ts index c4ccc08..b148939 100644 --- a/site/src/app/components/directives.demo/utility.directives.component.ts +++ b/site/src/app/components/directives.demo/utility.directives.component.ts @@ -1,17 +1,24 @@ -import { Component } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Router } from '@angular/router'; +import { AbstractDemoComponent } from './abstract.demo.component'; @Component({ selector: 'blox-utility-directives', templateUrl: './utility.directives.component.html' }) -export class UtilityDirectivesComponent { +export class UtilityDirectivesComponent extends AbstractDemoComponent { static DOC_SVG = require('!raw-loader!../../../assets/img/mdc-icons/feature_highlight.svg'); static DOC_TYPE = 'components'; static DOC_HREF = 'utility'; apiDoc: SafeHtml; - constructor(private sanitizer: DomSanitizer) { - this.apiDoc = this.sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/utility.html').default); + constructor(sanitizer: DomSanitizer, @Inject(DOCUMENT) doc: Document, router: Router) { + super( + sanitizer.bypassSecurityTrustHtml(require('!raw-loader!../../../../../bundle/apidocs/utility.html').default), + doc, + router + ); } } diff --git a/site/src/app/components/docs/gettingstarted.component.html b/site/src/app/components/docs/gettingstarted.component.html index bd6debf..804bed5 100644 --- a/site/src/app/components/docs/gettingstarted.component.html +++ b/site/src/app/components/docs/gettingstarted.component.html @@ -16,7 +16,7 @@

    Getting Started

    Check that you are using recent versions of Angular CLI, Node, and Npm: run ng version && npm -v && node -v to check your versions. - This guide was written using Angular CLI 9.0.7, Npm 6.13.4, and Node 12.16.1. + This guide was written using Angular CLI 11.0.4, Npm 6.14.8, and Node 14.15.0.

    Step 1: Prepare your Angular Project

    @@ -34,32 +34,26 @@

    Step 1: Prepare your Angular Project

    ng config schematics.@schematics/angular:component.styleext scss
    -

    Then simply rename src/styles.css to src/styles.scss, - and in the configuration file angular.json also change the reference - to styles.css to refer to styles.scss instead. - (You can find that under projects/NAME-OF-PROJECT/architect/build/options/styles - in the file). - Since scss is an extension of css, this will not affect your existing styles. -

    -

    For existing projects, also make sure that you are using at least Angular CLI 9 - (Angular CLI uses the version installed for your project, not the globally installed - version). This can be checked by running ng version in the project directory. - If the project uses an older Angular CLI version, upgrade it by running - npm install --save-dev @angular/cli in your project directory. +

    Changing the default stylesheet processor will not affect your existing styles. + However, you do not have to make Sass the default stylesheet processor to use Sass. + Even when using another default, the Angular CLI will process Sass stylesheets just fine, + provided they have the correct extension (scss).

    +

    Alternatively, you can use any other stylesheet processor and customize the appearance + of your website with CSS variables, instead of through Sass. + Using CSS variables has some limitations in what you can customize, and though supported by most + browsers, there are some exceptions, such as Internet Explorer. + See Can I Use CSS Variables.

    Step 2: Install Blox Material

    Now add the Blox Material library to your project:

    -
    npm install --save @blox/material
    -
    -

    Next install @angular/forms (optional):

    -
    -
    npm install --save @angular/forms
    +
    npm install --save @blox/material@beta

    And add the Material module to your application (in src/app/app.module.ts):

    -
    import {{'{ FormsModule }'}} from '@angular/forms'; // (optional)
    +  
    ...
    +import {{'{ FormsModule }'}} from '@angular/forms'; // (optional)
     import {{'{ MaterialModule }'}} from '@blox/material';
     
     @NgModule({{'{'}}
    @@ -82,8 +76,8 @@ 

    Step 2: Install Blox Material

    Rollup). Thus there is no need for smaller partial modules for separate components, like other Angular frameworks typically offer. - Just import the complete MaterialModule, only functionality that is actually used - is going to your customers! + Just import the complete MaterialModule, only functionality that is actually used in your application + ends up in the bundles that are loaded by the browser.

    The example also includes the @angular/forms FormsModule. Using the FormsModule @@ -101,47 +95,37 @@

    Step 2: Install Blox Material

    Step 3: Import and Customize a Theme

    -

    To tell the Sass preprocessor how to find all Material Components theme files, - add the following configuration to the build options section of your - project in the angular.json file (under - projects/NAME-OF-PROJECT/architect/build/options:

    -
    -
    {{'{'}}
    -    "projects": {{'{ "NAME-OF-PROJECT": { "architect": { "build": {'}}
    -        ...
    -        "options": {{'{'}}
    -            ...
    -            "styles": ...
    -            ...
    -            "stylePreprocessorOptions": {{'{'}}
    -                "includePaths": [
    -                    "node_modules"
    -                ]
    -            {{'}'}},
    -            ...
    -        {{'}'}}
    -    {{'\}\}\}\}'}}
    -    ...
    -{{'}'}}
    -
    -

    Next, add the following code to your src/styles.scss file:

    +

    Add the following code to your src/styles.scss file:

    -
    // customize some theme variables, e.g.:
    -$mdc-theme-primary: #6200ee;
    -$mdc-theme-secondary: #018786;
    -$mdc-theme-background: #fff;
    -
    -// import theming for all mdc components:
    -@import "material-components-web/material-components-web";
    +
    // customize some theme variables, when importing @material/theme:
    +@use "@material/theme" with (
    +  $primary: #ba6b6c,
    +  $secondary: #459493,
    +  $background: #f5f5f5,
    +  $surface: #f5f5f5,
    +  $on-primary: #fff,
    +  $on-secondary: #000,
    +  $on-surface: #000
    +);
    +// import styles for all mdc components:
    +@use "material-components-web/material-components-web"

    This will add theme styles for all available Material components. If you only use a couple of components, you can save memory by only including the theme files for the components you actually use. For example:

    -
    @import "@material/button/mdc-button";
    -@import "@material/card/mdc-fab";
    +
    @use "@material/theme" with ($primary: #ba6b6c);
    +@use "@material/button/mdc-button";
    +@use "@material/card/mdc-fab";
    +

    + For more information about customizing and extending the theme, see + Material Components Web Theme Documentation. + Most components also define Sass variables and/or mixins to further customize their appearance. + Links to the documentation for these Sass rules can be found on the component's documentation pages. +

    To use Google's Material Icons, and the Roboto font (default font for the Material Components), you may also want to add the following stylesheets to the head section of the src/index.html file (both are optional): @@ -150,20 +134,13 @@

    Step 3: Import and Customize a Theme

    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
     <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    -

    - For more information about customizing and extending the theme, see - Material Components Web Theme Documentation. - Most components also define Sass variables and/or mixins to further customize their appearance. - Links to the documentation for these Sass rules can be found on the component's documentation page. -

    -

    Step 4: Use Material Components!

    +

    Step 4: Use Material Components

    Open src/app/app.component.html and add some markup, for example:

    <button mdcButton raised>My First Material Button</button>
    -

    Next, run npm run start and when the application starts, navigate to http://localhost:4200. +

    Next, run ng serve and when the application starts, navigate to http://localhost:4200. Validate you see the added button, and that it is correctly styled. Congratulations! You have made your first Angular App with Blox Material! The Components section of this website contains documentation and diff --git a/site/src/app/components/docs/gettingstarted.component.ts b/site/src/app/components/docs/gettingstarted.component.ts index 4e5bcc7..1457d68 100644 --- a/site/src/app/components/docs/gettingstarted.component.ts +++ b/site/src/app/components/docs/gettingstarted.component.ts @@ -1,5 +1,4 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ThemeService } from '../../services'; +import { Component } from '@angular/core'; @Component({ selector: 'blox-gettingstarted', @@ -8,15 +7,4 @@ import { ThemeService } from '../../services'; export class GettingstartedComponent { static DOC_TYPE = 'guides'; static DOC_HREF = 'gettingStarted'; - - constructor(private theme: ThemeService) { - } - - ngOnInit() { - this.theme.setTheme('blox-theme-dark'); - } - - ngOnDestroy() { - this.theme.setTheme(null); - } } diff --git a/site/src/app/components/docs/guides.component.ts b/site/src/app/components/docs/guides.component.ts index 725b03e..a237629 100644 --- a/site/src/app/components/docs/guides.component.ts +++ b/site/src/app/components/docs/guides.component.ts @@ -1,22 +1,10 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ThemeService } from '../../services'; +import { Component } from '@angular/core'; @Component({ selector: 'blox-guides', templateUrl: './guides.component.html' }) -export class GuidesComponent implements OnInit, OnDestroy{ +export class GuidesComponent { static DOC_TYPE = 'docs'; static DOC_HREF = 'guides'; - - constructor(private theme: ThemeService) { - } - - ngOnInit() { - this.theme.setTheme('blox-theme-dark'); - } - - ngOnDestroy() { - this.theme.setTheme(null); - } } diff --git a/site/src/app/components/docs/ie11.component.html b/site/src/app/components/docs/ie11.component.html index b5f0fb6..18ff28a 100644 --- a/site/src/app/components/docs/ie11.component.html +++ b/site/src/app/components/docs/ie11.component.html @@ -7,33 +7,28 @@

    Building for IE11

  • Material Web Components are distributed as ES6 javascript. IE11 only supports ES5 javascript.
  • - Luckily since Angular CLI 9 it has become a lot easier to configure your angular app for IE11. - However this will only work for (production) builds. The ng serve command does not - offer a configuration options to transpile library dependencies to ES5 on demand. Since - the material-web-components library is currently only distributed in ES6 javascript, - ng serve will not work for IE11. -

    -

    - For (production) builds, supporting IE11 is made super easy though, with the default - differential loading that Angular CLI supports. + Luckily with only a few tweaks, it's possible to also support IE11!

    Step 1: Edit browserslist

    - Angular CLI has created a file browserslist in the root directory of your project. + Angular CLI has created a file .browserslistrc in the root directory of your project. Just make sure that the list of supported browsers includes IE:

    -
    ...
    -last 2 versions
    -not dead
    +  
    last 1 Chrome version
    +...
     IE 11
     ...

    - Now when you run ng serve, the generated application will contain - javascript for both es2015 and es5 browsers. The html is generated so that - browsers will only load the versions they need (and support). + Now when you run ng build, the generated application will contain + javascript for both es2015 and es5 browsers. The angular CLI just creates an + extra bundle by transpiling the es2015 code to es5 javascript. The html is generated + so that browsers will only load the versions they need (and support). + This is called Differential Loading. For more information check out: + https://angular.io/guide/deployment#differential-loading

    Step 2: Edit polyfills.ts

    @@ -44,7 +39,7 @@

    Step 2: Edit polyfills.ts

    ...
    -/** IE10 and IE11 requires the following for NgClass support on SVG elements */
    +/** IE11 requires the following for NgClass support on SVG elements */
     import 'classlist.js';  // Run 'npm install --save classlist.js'.
     ...
    @@ -54,10 +49,18 @@

    Step 2: Edit polyfills.ts

    npm install --save classlist.js
    - -

    +

    Congratulations! You now have your Angular application fully integrated with Blox Material, optimized and working for any browser supported by Angular. Now head to the components documentation for code samples and instructions on how to use all Material components in your app!

    + +
    + The steps in this guide help in creating a production build of your application + that is compatible with IE11. Local development (by executing ng serve) + will still not work with IE11, since it doesn't use differential loading. + Check out https://angular.io/guide/deployment#local-development-in-older-browsers + for ways to use IE11 during local development, debugging, and testing of your application. +
    \ No newline at end of file diff --git a/site/src/app/components/docs/ie11.component.ts b/site/src/app/components/docs/ie11.component.ts index 9009a8c..1322337 100644 --- a/site/src/app/components/docs/ie11.component.ts +++ b/site/src/app/components/docs/ie11.component.ts @@ -1,5 +1,4 @@ import { Component } from '@angular/core'; -import { ThemeService } from '../../services'; @Component({ selector: 'blox-ie11', @@ -8,15 +7,4 @@ import { ThemeService } from '../../services'; export class IE11Component { static DOC_TYPE = 'guides'; static DOC_HREF = 'ie11'; - - constructor(private theme: ThemeService) { - } - - ngOnInit() { - this.theme.setTheme('blox-theme-dark'); - } - - ngOnDestroy() { - this.theme.setTheme(null); - } } diff --git a/site/src/app/components/docs/index.component.ts b/site/src/app/components/docs/index.component.ts index 9313bdf..7252b7d 100644 --- a/site/src/app/components/docs/index.component.ts +++ b/site/src/app/components/docs/index.component.ts @@ -1,19 +1,8 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ThemeService } from '../../services'; +import { Component } from '@angular/core'; @Component({ selector: 'blox-index', templateUrl: './index.component.html' }) -export class IndexComponent implements OnInit, OnDestroy { - constructor(private theme: ThemeService) { - } - - ngOnInit() { - this.theme.setTheme('blox-theme-dark'); - } - - ngOnDestroy() { - this.theme.setTheme(null); - } +export class IndexComponent { } diff --git a/site/src/app/components/highlightjs/highlightjs.directive.ts b/site/src/app/components/highlightjs/highlightjs.directive.ts index d31896e..3318183 100644 --- a/site/src/app/components/highlightjs/highlightjs.directive.ts +++ b/site/src/app/components/highlightjs/highlightjs.directive.ts @@ -1,5 +1,5 @@ -import { AfterViewInit, Directive, ElementRef, HostBinding, Injectable, Input, SimpleChanges } from '@angular/core'; -import { Observable, ReplaySubject } from 'rxjs'; +import { AfterViewInit, Directive, ElementRef, Injectable, Input, SimpleChanges } from '@angular/core'; +import { Observable, ReplaySubject, Subject } from 'rxjs'; @Injectable({ providedIn: 'root' @@ -7,7 +7,17 @@ import { Observable, ReplaySubject } from 'rxjs'; export class HighlightjsService { highlight(code: string, lang: string): Observable { let result = new ReplaySubject(1); - import(/* webpackChunkName: "hljs" */'highlight.js/lib/highlight').then(mod => { + if (![].includes) { + import(/* webpackChunkName: "ie11polyf" */'core-js/modules/es.array.includes').then(() => { + this.importHighlightJs(code, lang, result); + }); + } else + this.importHighlightJs(code, lang, result); + return result.asObservable(); + } + + importHighlightJs(code: string, lang: string, result: Subject) { + import(/* webpackChunkName: "hljs" */'highlight.js/lib/core').then(mod => { const hljs = mod.default; const langTs = require('highlight.js/lib/languages/typescript'); const langHtml = require('highlight.js/lib/languages/xml'); @@ -23,7 +33,6 @@ export class HighlightjsService { result.next(prettyCode); result.complete(); }); - return result.asObservable(); } } diff --git a/site/src/app/components/notfound/notfound.component.ts b/site/src/app/components/notfound/notfound.component.ts index be495eb..1835d2a 100644 --- a/site/src/app/components/notfound/notfound.component.ts +++ b/site/src/app/components/notfound/notfound.component.ts @@ -1,5 +1,4 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ThemeService } from '../../services'; +import { Component } from '@angular/core'; @Component({ selector: 'error-404', @@ -9,17 +8,6 @@ export class NotFoundComponent { static DOC_TYPE = 'errors'; static DOC_HREF = '404'; - constructor(private theme: ThemeService) { - } - - ngOnInit() { - this.theme.setTheme('blox-theme-dark'); - } - - ngOnDestroy() { - this.theme.setTheme(null); - } - get pageUrl() { return document.location.href; } diff --git a/site/src/app/components/shared.ts b/site/src/app/components/shared.ts index 7c7f876..b1a1c38 100644 --- a/site/src/app/components/shared.ts +++ b/site/src/app/components/shared.ts @@ -1,3 +1,4 @@ export * from './notfound'; export * from './highlightjs/highlightjs.directive'; export * from './code.sample'; +export * from './theme'; diff --git a/site/src/app/components/snippets/abstract.snippet.component.ts b/site/src/app/components/snippets/abstract.snippet.component.ts index fe031c0..94d455c 100644 --- a/site/src/app/components/snippets/abstract.snippet.component.ts +++ b/site/src/app/components/snippets/abstract.snippet.component.ts @@ -3,16 +3,19 @@ export class AbstractSnippetComponent { public mainComponent: string; public mainImport: string; public disableStackblitz = false; + public cacheAssets: {[key: string]: string}; - constructor(public code: {[key: string]: string}) { + constructor(public code: {[key: string]: string}, cacheAssets: {[key: string]: string} = {}, rootTs = 'typescript', + public options: {noBodyMargins?: boolean} = {}) { for (let name in code) { if (code.hasOwnProperty(name)) code[name] = this.rewrite(code[name]); } - this.mainElement = this.extract(code['typescript'], /selector\s*\:\s*['"]([^'"]+)['"]/); - this.mainComponent = this.extract(code['typescript'], /export\s+class\s+([a-zA-Z0-9_]+Component)/); - this.mainImport = this.extract(code['typescript'], /templateUrl\s*\:\s*['"]\.\/([^'"]+)\.html['"]/); - + this.mainElement = this.extract(code[rootTs], /selector\s*\:\s*['"]([^'"]+)['"]/); + this.mainComponent = this.extract(code[rootTs], /export\s+class\s+([a-zA-Z0-9_]+Component)/); + this.mainImport = this.extract(code[rootTs], /templateUrl\s*\:\s*['"]\.\/([^'"]+)\.html['"]/); + this.cacheAssets = cacheAssets; + this.options = options; } rewrite(value: string | {default}): string { @@ -20,7 +23,7 @@ export class AbstractSnippetComponent { return value .replace(/\s*\/\/\s*snip\:skip[\s\S]*?\/\/\s*snip:endskip.*/g, '') .replace(/\/\*\s*snip\:skip[\s\S]*?snip:endskip\*\//g, '') - .replace(/.*snippet-skip-line.*/g, '') + .replace(/.*snippet-skip-line.*\r?[\n$]/g, '') .replace(/^(?:[ \r]*\n)*/, '') // drop empty lines from start .replace(/(?:\r?\n[ \r]*)*$/, '') // drop empty lines from end ; diff --git a/site/src/app/components/snippets/directives/index.ts b/site/src/app/components/snippets/directives/index.ts index ac77bd6..f66f76c 100644 --- a/site/src/app/components/snippets/directives/index.ts +++ b/site/src/app/components/snippets/directives/index.ts @@ -1,35 +1,32 @@ -export * from './snippet.button.component'; -export * from './snippet.card.component'; -export * from './snippet.checkbox.component'; -export * from './snippet.chips.component'; -export * from './snippet.chips.choice.component'; -export * from './snippet.chips.filter.component'; -export * from './snippet.chips.input.component'; -export * from './snippet.dialog.component'; -export * from './snippet.drawer.permanent.below.component'; -export * from './snippet.drawer.permanent.component'; -export * from './snippet.drawer.slidable.component'; -export * from './snippet.elevation.component'; -export * from './snippet.fab.component'; -export * from './snippet.focus-trap.component'; -export * from './snippet.icon-button.component'; -export * from './snippet.icon-toggle.component'; -export * from './snippet.linear-progress.component'; -export * from './snippet.list.component'; -export * from './snippet.list.twoline.component'; -export * from './snippet.menu.component'; -export * from './snippet.snackbar.component'; -export * from './snippet.radio.component'; -export * from './snippet.ripple.component'; -export * from './snippet.select.component'; -export * from './snippet.slider.component'; -export * from './snippet.switch.component'; -export * from './snippet.tab.simple.component'; -export * from './snippet.tab.icons.component'; -export * from './snippet.tab.scroller.component'; -export * from './snippet.text-field.component'; -export * from './snippet.text-field.icon.component'; -export * from './snippet.text-field.textarea.component'; -export * from './snippet.toolbar.component'; -export * from './snippet.toolbar.flexible.component'; -export * from './snippet.top-app-bar.component'; +export * from './snippet.button.component'; +export * from './snippet.card.component'; +export * from './snippet.checkbox.component'; +export * from './snippet.chips.component'; +export * from './snippet.chips.choice.component'; +export * from './snippet.chips.filter.component'; +export * from './snippet.chips.input.component'; +export * from './snippet.dialog.component'; +export * from './snippet.drawer.below.component'; +export * from './snippet.drawer.component'; +export * from './snippet.elevation.component'; +export * from './snippet.fab.component'; +export * from './snippet.focus-trap.component'; +export * from './snippet.icon-button.component'; +export * from './snippet.linear-progress.component'; +export * from './snippet.list.component'; +export * from './snippet.list.twoline.component'; +export * from './snippet.menu.component'; +export * from './snippet.radio.component'; +export * from './snippet.ripple.component'; +export * from './snippet.select.component'; +export * from './snippet.slider.component'; +export * from './snippet.snackbar.component'; +export * from './snippet.switch.component'; +export * from './snippet.tab.icons.component'; +export * from './snippet.tab.routing.component'; +export * from './snippet.tab.scroller.component'; +export * from './snippet.tab.simple.component'; +export * from './snippet.text-field.component'; +export * from './snippet.text-field.icon.component'; +export * from './snippet.text-field.textarea.component'; +export * from './snippet.top-app-bar.component'; diff --git a/site/src/app/components/snippets/directives/snippet.button.component.html b/site/src/app/components/snippets/directives/snippet.button.component.html index ed9935c..6784db2 100644 --- a/site/src/app/components/snippets/directives/snippet.button.component.html +++ b/site/src/app/components/snippets/directives/snippet.button.component.html @@ -27,11 +27,17 @@

    Buttons:

    - - + +

    Anchors:

    Default -Dense -favorite Icon +favoriteIcon + + Icon After + favorite +
    diff --git a/site/src/app/components/snippets/directives/snippet.card.component.html b/site/src/app/components/snippets/directives/snippet.card.component.html index 5d2ca24..c994ff4 100644 --- a/site/src/app/components/snippets/directives/snippet.card.component.html +++ b/site/src/app/components/snippets/directives/snippet.card.component.html @@ -17,10 +17,10 @@
    -

    Our Changing Planet

    -

    by Kurt Wagner

    +

    Our Changing Planet

    +

    by Kurt Wagner

    -
    +
    Visit ten places on our planet that are undergoing the biggest changes today.
    @@ -29,10 +29,10 @@

    by Kurt Wagner

    -

    Our Changing Planet

    -

    by Kurt Wagner

    +

    Our Changing Planet

    +

    by Kurt Wagner

    -
    - +
    @@ -55,29 +57,33 @@

    by Kurt Wagner

    -

    Vacation Photos

    +

    Vacation Photos

    - - + +
    -
    Headlines
    +
    Headlines

    -

    Copper on the rise

    -

    +

    Copper on the rise

    +

    Copper price soars amid global market optimism and increased demand.

    @@ -85,8 +91,8 @@

    Copper on the rise


    -

    U.S. tech startups rebound

    -

    +

    U.S. tech startups rebound

    +

    Favorable business conditions have allowed startups to secure more fundraising deals compared to last year.

    @@ -95,8 +101,8 @@

    U.S. tech startups rebound


    -

    Asia's clean energy ambitions

    -

    +

    Asia's clean energy ambitions

    +

    China plans to invest billions of dollars for the development of over 300 clean energy projects in Southeast Asia.

    @@ -116,9 +122,9 @@

    Asia's clean energy ambitions

    -

    Rozes

    -
    Under the Grave
    -
    (2016)
    +

    Rozes

    +
    Under the Grave
    +
    (2016)
    diff --git a/site/src/app/components/snippets/directives/snippet.card.component.scss b/site/src/app/components/snippets/directives/snippet.card.component.scss index 458fc17..6855c40 100644 --- a/site/src/app/components/snippets/directives/snippet.card.component.scss +++ b/site/src/app/components/snippets/directives/snippet.card.component.scss @@ -1,7 +1,5 @@ -@import "@material/theme/mixins"; -@import "@material/typography/mixins"; -@import "@material/rtl/mixins"; -@import "@material/card/mixins"; // stackblitz-skip-line: Not supported on stackblitz due to https://github.com/stackblitz/core/issues/284 +@use "@material/rtl"; // snippet-skip-line (@use not supported by stackblitz) +@use "@material/card"; // snippet-skip-line (@use not supported by stackblitz) .custom-card-container { display: flex; @@ -17,25 +15,21 @@ .custom-card__primary { padding: 1rem; h2 { - @include mdc-typography('headline6'); margin: 0; } h3 { - @include mdc-typography('subtitle2'); - @include mdc-theme-prop(color, text-secondary-on-background); + opacity: 0.54; margin: 0; } } .custom-card__secondary { - @include mdc-typography('body2'); - @include mdc-theme-prop(color, text-secondary-on-background); + opacity: 0.54; padding: 0 1rem 8px; } .custom-card-group-heading { - @include mdc-typography('subtitle2'); - @include mdc-theme-prop(color, text-secondary-on-light); + opacity: 0.54; padding: 8px 16px; } @@ -45,12 +39,10 @@ color: inherit; h2 { - @include mdc-typography('headline5'); margin: 0 0 4px 0; } p { - @include mdc-typography('body2'); - @include mdc-theme-prop(color, text-secondary-on-light); + opacity: 0.54; margin: 0; } } @@ -66,37 +58,34 @@ h2 { padding: 8px 16px; margin: 0; - @include mdc-typography('subtitle1'); background-image: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.5) 100%); - color: white; } } } &.custom-card-music { - // stackblitz-skip-line: material/card/mixins not supported on stackblitz due to https://github.com/stackblitz/core/issues/284 - @include mdc-card-corner-radius(24px 4px); // stackblitz-skip-line - @include mdc-rtl { // stackblitz-skip-line - @include mdc-card-corner-radius(4px 24px); // stackblitz-skip-line - } // stackblitz-skip-line + @include card.shape-radius(24px 4px, true); // snippet-skip-line .custom-card-music-row { display: flex; border-top-left-radius: inherit; - @include mdc-rtl { + //snip:skip + @include rtl.rtl { border-top-left-radius: 0; border-top-right-radius: inherit; } + //snip:endskip } [mdcCardMedia] { width: 110px; border-top-left-radius: inherit; - - @include mdc-rtl { + //snip:skip + @include rtl.rtl { border-top-left-radius: 0; border-top-right-radius: inherit; } + //snip:endskip } .custom-card-music-info { @@ -105,26 +94,16 @@ padding: 8px 16px; h2 { - @include mdc-typography('headline5'); margin: 0; } - - .custom-card-music-artist { - @include mdc-typography('body2'); - } - - - .custom-card-music-year { - @include mdc-typography('body2'); - } } } .mdc-card__media--16-9 { - background-image: url(/assets/img/mdc-demos/16-9.jpg); + background-image: url(../../../../assets/img/mdc-demos/16-9.jpg); } .mdc-card__media--square { - background-image: url(/assets/img/mdc-demos/1-1.jpg); + background-image: url(../../../../assets/img/mdc-demos/1-1.jpg); } } diff --git a/site/src/app/components/snippets/directives/snippet.card.component.ts b/site/src/app/components/snippets/directives/snippet.card.component.ts index 0398b96..8db24bb 100644 --- a/site/src/app/components/snippets/directives/snippet.card.component.ts +++ b/site/src/app/components/snippets/directives/snippet.card.component.ts @@ -14,13 +14,16 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; }) export class SnippetCardComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { rtl = false; - outlined = false; + outlined = true; //snip:skip constructor() { super({ 'html': require('!raw-loader!./snippet.card.component.html'), 'scss': require('!raw-loader!./snippet.card.component.scss'), 'typescript': require('!raw-loader!./snippet.card.component.ts') + }, { + '../../../../assets/img/mdc-demos/16-9.jpg': require('!file-loader!../../../../assets/img/mdc-demos/16-9.jpg').default, + '../../../../assets/img/mdc-demos/1-1.jpg': require('!file-loader!../../../../assets/img/mdc-demos/1-1.jpg').default }); } //snip:endskip diff --git a/site/src/app/components/snippets/directives/snippet.chips.choice.component.html b/site/src/app/components/snippets/directives/snippet.chips.choice.component.html index 479ac78..e810d7c 100644 --- a/site/src/app/components/snippets/directives/snippet.chips.choice.component.html +++ b/site/src/app/components/snippets/directives/snippet.chips.choice.component.html @@ -1,9 +1,29 @@
    -
    Extra Small
    -
    Small
    -
    Medium
    -
    Large
    -
    Extra Large
    +
    +
    +
    Extra Small
    +
    +
    +
    +
    +
    Small
    +
    +
    +
    +
    +
    Medium
    +
    +
    +
    +
    +
    Large
    +
    +
    +
    +
    +
    Extra Large
    +
    +
    diff --git a/site/src/app/components/snippets/directives/snippet.chips.component.html b/site/src/app/components/snippets/directives/snippet.chips.component.html index 53c8a18..6a1f281 100644 --- a/site/src/app/components/snippets/directives/snippet.chips.component.html +++ b/site/src/app/components/snippets/directives/snippet.chips.component.html @@ -2,19 +2,27 @@
    wb_sunny -
    Turn lights on
    + +
    Turn lights on
    +
    bookmark -
    Bookmark
    + +
    Bookmark
    +
    alarm -
    Set alarm
    + +
    Set alarm
    +
    directions -
    Get directions
    + +
    Get directions
    +
    diff --git a/site/src/app/components/snippets/directives/snippet.chips.filter.component.html b/site/src/app/components/snippets/directives/snippet.chips.filter.component.html index 50e79d4..4b5c1f8 100644 --- a/site/src/app/components/snippets/directives/snippet.chips.filter.component.html +++ b/site/src/app/components/snippets/directives/snippet.chips.filter.component.html @@ -2,19 +2,27 @@
    message -
    Messages
    + +
    Messages
    +
    notification_important -
    Notifications
    + +
    Notifications
    +
    warning -
    Warnings
    + +
    Warnings
    +
    error -
    Errors
    + +
    Errors
    +
    diff --git a/site/src/app/components/snippets/directives/snippet.chips.input.component.html b/site/src/app/components/snippets/directives/snippet.chips.input.component.html index 2b5238c..ef5e926 100644 --- a/site/src/app/components/snippets/directives/snippet.chips.input.component.html +++ b/site/src/app/components/snippets/directives/snippet.chips.input.component.html @@ -1,9 +1,15 @@
    -
    +
    face -
    {{chip}}
    - cancel + + +
    {{chip.name}}
    +
    +
    + + cancel +
    diff --git a/site/src/app/components/snippets/directives/snippet.chips.input.component.ts b/site/src/app/components/snippets/directives/snippet.chips.input.component.ts index 8a0cace..afdc981 100644 --- a/site/src/app/components/snippets/directives/snippet.chips.input.component.ts +++ b/site/src/app/components/snippets/directives/snippet.chips.input.component.ts @@ -12,7 +12,11 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; templateUrl: './snippet.chips.input.component.html' }) export class SnippetChipsInputComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - chips = [ 'claire', 'pete', 'anne' ]; + readonly chips = [ + {name: 'claire'}, + {name: 'pete'}, + {name: 'anne'} + ]; newChip: string; //snip:skip @@ -28,9 +32,9 @@ export class SnippetChipsInputComponent/*snip:skip*/extends AbstractSnippetCompo if (this.newChip) { let value = this.newChip.trim(); if (value.length) - this.chips.push(value); + this.chips.push({name: value}); } - this.newChip = null; + this.newChip = ''; } removeChip(index: number) { diff --git a/site/src/app/components/snippets/directives/snippet.dialog.component.html b/site/src/app/components/snippets/directives/snippet.dialog.component.html index 83ec627..8421617 100644 --- a/site/src/app/components/snippets/directives/snippet.dialog.component.html +++ b/site/src/app/components/snippets/directives/snippet.dialog.component.html @@ -4,55 +4,41 @@
    -
    -
    +
    -
    - + +
    +

    Selection mode:

    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    diff --git a/site/src/app/components/snippets/directives/snippet.list.component.scss b/site/src/app/components/snippets/directives/snippet.list.component.scss index 49cbf2c..e4b74d0 100644 --- a/site/src/app/components/snippets/directives/snippet.list.component.scss +++ b/site/src/app/components/snippets/directives/snippet.list.component.scss @@ -4,9 +4,4 @@ [mdcAvatarList] [mdcListItemGraphic] { background-color: rgba(0, 0, 0, .26); } - - a { - text-decoration: none; - color: rgba(0, 0, 0, .85); - } -} \ No newline at end of file +} diff --git a/site/src/app/components/snippets/directives/snippet.list.component.ts b/site/src/app/components/snippets/directives/snippet.list.component.ts index a463b41..043ab54 100644 --- a/site/src/app/components/snippets/directives/snippet.list.component.ts +++ b/site/src/app/components/snippets/directives/snippet.list.component.ts @@ -13,18 +13,24 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; styleUrls: ['./snippet.list.component.scss'] }) export class SnippetListComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { + srcAvatar1 = require('!file-loader!../../../../assets/img/mdc-demos/animal1.svg').default; + srcAvatar2 = require('!file-loader!../../../../assets/img/mdc-demos/animal2.svg').default; startDetail = true; endDetail = true; avatar = false; dense = false; - interactive = true; + interactive = true; + selectionMode: 'single' | 'active' | '' = ''; //snip:skip constructor() { super({ - 'html': require('!raw-loader!./snippet.list.component.html'), - 'scss': require('!raw-loader!./snippet.list.component.scss'), - 'typescript': require('!raw-loader!./snippet.list.component.ts') + 'html': require('!raw-loader!./snippet.list.component.html'), + 'scss': require('!raw-loader!./snippet.list.component.scss'), + 'typescript': require('!raw-loader!./snippet.list.component.ts') + }, { + '../../../../assets/img/mdc-demos/animal1.svg': require('!file-loader!../../../../assets/img/mdc-demos/animal1.svg').default, + '../../../../assets/img/mdc-demos/animal2.svg': require('!file-loader!../../../../assets/img/mdc-demos/animal2.svg').default }); } //snip:endskip diff --git a/site/src/app/components/snippets/directives/snippet.list.twoline.component.html b/site/src/app/components/snippets/directives/snippet.list.twoline.component.html index 26c3836..34c59c3 100644 --- a/site/src/app/components/snippets/directives/snippet.list.twoline.component.html +++ b/site/src/app/components/snippets/directives/snippet.list.twoline.component.html @@ -1,11 +1,11 @@

    Connectivity

    -
      +
      • network_wifi - Wi-Fi + Wi-Fi Strong signal signal_wifi_4_bar @@ -13,7 +13,7 @@

        Connectivity

      • bluetooth - Bluetooth + Bluetooth Searching for signal bluetooth_searching @@ -21,32 +21,32 @@

        Connectivity

      • data_usage - Data Usage + Data Usage Inside your bundle - show_chart + show_chart

      Folders

      -
        +
        • insert_drive_file - + - Photos + Photos 21 new photos - star + star
        • insert_drive_file - + - Movies + Movies 2 new movies - star + star
    @@ -80,5 +80,24 @@

    Folders

    - + +

    Selection mode:

    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    diff --git a/site/src/app/components/snippets/directives/snippet.list.twoline.component.scss b/site/src/app/components/snippets/directives/snippet.list.twoline.component.scss index 49cbf2c..e4b74d0 100644 --- a/site/src/app/components/snippets/directives/snippet.list.twoline.component.scss +++ b/site/src/app/components/snippets/directives/snippet.list.twoline.component.scss @@ -4,9 +4,4 @@ [mdcAvatarList] [mdcListItemGraphic] { background-color: rgba(0, 0, 0, .26); } - - a { - text-decoration: none; - color: rgba(0, 0, 0, .85); - } -} \ No newline at end of file +} diff --git a/site/src/app/components/snippets/directives/snippet.list.twoline.component.ts b/site/src/app/components/snippets/directives/snippet.list.twoline.component.ts index 6376db0..aecf9d1 100644 --- a/site/src/app/components/snippets/directives/snippet.list.twoline.component.ts +++ b/site/src/app/components/snippets/directives/snippet.list.twoline.component.ts @@ -13,11 +13,14 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; styleUrls: ['./snippet.list.twoline.component.scss'] }) export class SnippetListTwolineComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { + srcAvatar1 = require('!file-loader!../../../../assets/img/mdc-demos/animal1.svg').default; // TODO stackblitz, see SnippetCardComponent? + srcAvatar2 = require('!file-loader!../../../../assets/img/mdc-demos/animal2.svg').default; startDetail = true; endDetail = true; avatar = false; dense = false; interactive = true; + selectionMode: 'single' | 'active' | '' = ''; //snip:skip constructor() { @@ -25,6 +28,9 @@ export class SnippetListTwolineComponent/*snip:skip*/extends AbstractSnippetComp 'html': require('!raw-loader!./snippet.list.twoline.component.html'), 'scss': require('!raw-loader!./snippet.list.twoline.component.scss'), 'typescript': require('!raw-loader!./snippet.list.twoline.component.ts') + }, { + '../../../../assets/img/mdc-demos/animal1.svg': require('!file-loader!../../../../assets/img/mdc-demos/animal1.svg').default, + '../../../../assets/img/mdc-demos/animal2.svg': require('!file-loader!../../../../assets/img/mdc-demos/animal2.svg').default }); } //snip:endskip diff --git a/site/src/app/components/snippets/directives/snippet.menu.component.html b/site/src/app/components/snippets/directives/snippet.menu.component.html index 38055d8..9733461 100644 --- a/site/src/app/components/snippets/directives/snippet.menu.component.html +++ b/site/src/app/components/snippets/directives/snippet.menu.component.html @@ -1,18 +1,22 @@
    -
    -
    - -
    +snippet-skip-line --> +
    +
    + + +
    + (pick)="select($event.value)">
      -
    • Back
    • -
    • Forward
    • -
    • Reload
    • +
    • Back
    • +
    • Forward
    • +
    • Reload
    • -
    • Save As...
    • +
    • Save As...
    diff --git a/site/src/app/components/snippets/directives/snippet.menu.component.scss b/site/src/app/components/snippets/directives/snippet.menu.component.scss index b9e8d93..85fa5ef 100644 --- a/site/src/app/components/snippets/directives/snippet.menu.component.scss +++ b/site/src/app/components/snippets/directives/snippet.menu.component.scss @@ -1,8 +1,8 @@ .snippet-container { position: relative; - height: 200px; + height: 300px; flex: 1; } -.mdc-menu-anchor { +.mdc-menu-surface--anchor { position: absolute; } \ No newline at end of file diff --git a/site/src/app/components/snippets/directives/snippet.ripple.component.html b/site/src/app/components/snippets/directives/snippet.ripple.component.html index 431b747..9f9385b 100644 --- a/site/src/app/components/snippets/directives/snippet.ripple.component.html +++ b/site/src/app/components/snippets/directives/snippet.ripple.component.html @@ -2,7 +2,9 @@
    Ripple - Interact with me!
    +
    Unbounded Ripple - Interact with me!
    +
    diff --git a/site/src/app/components/snippets/directives/snippet.ripple.component.scss b/site/src/app/components/snippets/directives/snippet.ripple.component.scss index 7eaef24..4d1b32e 100644 --- a/site/src/app/components/snippets/directives/snippet.ripple.component.scss +++ b/site/src/app/components/snippets/directives/snippet.ripple.component.scss @@ -8,4 +8,8 @@ height: 100px; padding: 1rem; cursor: pointer; + + &[unbounded] { + overflow: visible; + } } diff --git a/site/src/app/components/snippets/directives/snippet.select.component.html b/site/src/app/components/snippets/directives/snippet.select.component.html index bdece4d..4c40f84 100644 --- a/site/src/app/components/snippets/directives/snippet.select.component.html +++ b/site/src/app/components/snippets/directives/snippet.select.component.html @@ -1,15 +1,25 @@
    -
    - - + +
    +
    +
    {{value}}
    + + + Pick a Food Group + + + + Pick a Food Group + +
    +
    +
      +
    • Bread, Cereal, Rice, and Pasta
    • +
    • Vegetables, and Fruit
    • +
    • Milk, Yogurt, and Cheese
    • +
    • Meat, Poultry, Fish, Dry Beans, Eggs, and Nuts
    • +
    +


    Your choice: {{value}}
    @@ -21,12 +31,6 @@
    -
    -
    - -
    - -
    @@ -36,5 +40,5 @@
    - +
    diff --git a/site/src/app/components/snippets/directives/snippet.select.component.ts b/site/src/app/components/snippets/directives/snippet.select.component.ts index 3413ef8..16a0322 100644 --- a/site/src/app/components/snippets/directives/snippet.select.component.ts +++ b/site/src/app/components/snippets/directives/snippet.select.component.ts @@ -15,8 +15,7 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; export class SnippetSelectComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { value: string; disabled = false; - private _box = false; - private _outlined = true; + outlined = true; //snip:skip constructor() { @@ -31,24 +30,4 @@ export class SnippetSelectComponent/*snip:skip*/extends AbstractSnippetComponent clear() { this.value = null; } - - get box() { - return this._box; - } - - set box(value: boolean) { - this._box = value; - if (value) - this._outlined = false; - } - - get outlined() { - return this._outlined; - } - - set outlined(value: boolean) { - this._outlined = value; - if (value) - this._box = false; - } } diff --git a/site/src/app/components/snippets/directives/snippet.slider.component.html b/site/src/app/components/snippets/directives/snippet.slider.component.html index df20c7f..77fc327 100644 --- a/site/src/app/components/snippets/directives/snippet.slider.component.html +++ b/site/src/app/components/snippets/directives/snippet.slider.component.html @@ -7,19 +7,19 @@

    Customize slider:

    - +
    - +
    - +
    - +
    diff --git a/site/src/app/components/snippets/directives/snippet.snackbar.component.html b/site/src/app/components/snippets/directives/snippet.snackbar.component.html index 8725f29..026d75f 100644 --- a/site/src/app/components/snippets/directives/snippet.snackbar.component.html +++ b/site/src/app/components/snippets/directives/snippet.snackbar.component.html @@ -1,11 +1,11 @@
    - +
    - +
    diff --git a/site/src/app/components/snippets/directives/snippet.snackbar.component.ts b/site/src/app/components/snippets/directives/snippet.snackbar.component.ts index daafeee..89bfe38 100644 --- a/site/src/app/components/snippets/directives/snippet.snackbar.component.ts +++ b/site/src/app/components/snippets/directives/snippet.snackbar.component.ts @@ -36,19 +36,18 @@ export class SnippetSnackbarComponent/*snip:skip*/extends AbstractSnippetCompone } show() { - let id = this.nextSnackbarId++; + this.nextSnackbarId++; let action = this.actionText; let message = this.messageText; let snackbarRef = this.snackbar.show({ message: this.messageText, actionText: this.actionText, - multiline: this.multiline, - actionOnBottom: this.multiline && this.actionOnBottom + stacked: this.multiline }); - snackbarRef.afterShow().subscribe(() => { + snackbarRef.afterOpened().subscribe(() => { this.currentMessage = '\'' + message + '\''; }); - snackbarRef.afterHide().subscribe(() => { + snackbarRef.afterClosed().subscribe(() => { this.currentMessage = ''; }); snackbarRef.action().subscribe(() => { diff --git a/site/src/app/components/snippets/directives/snippet.switch.component.html b/site/src/app/components/snippets/directives/snippet.switch.component.html index 87c404a..47a2bf4 100644 --- a/site/src/app/components/snippets/directives/snippet.switch.component.html +++ b/site/src/app/components/snippets/directives/snippet.switch.component.html @@ -1,7 +1,9 @@
    - +
    + +
    diff --git a/site/src/app/components/snippets/directives/snippet.tab.icons.component.html b/site/src/app/components/snippets/directives/snippet.tab.icons.component.html index a8431b7..7dc2734 100644 --- a/site/src/app/components/snippets/directives/snippet.tab.icons.component.html +++ b/site/src/app/components/snippets/directives/snippet.tab.icons.component.html @@ -1,16 +1,27 @@
    -
    - -
    - +
    + +
    +

    {{tabs[active].content}}
    diff --git a/site/src/app/components/snippets/directives/snippet.tab.icons.component.ts b/site/src/app/components/snippets/directives/snippet.tab.icons.component.ts index cecafb3..b442011 100644 --- a/site/src/app/components/snippets/directives/snippet.tab.icons.component.ts +++ b/site/src/app/components/snippets/directives/snippet.tab.icons.component.ts @@ -14,16 +14,10 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; export class SnippetTabIconsComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { showText = true; tabs = [ - { - name: 'Tab 1', - content: 'First tab', - icon: 'phone' - }, - { - name: 'Tab Two', - content: 'Second tab', - icon: 'favorite' - } + {name: 'Tab 1', content: 'First tab', icon: 'phone'}, + {name: 'Tab Two', content: 'Second tab', icon: 'access_time'}, + {name: 'Tab Three', content: 'Third tab', icon: 'near_me'}, + {name: 'Tab Four', content: 'Fourth tab', icon: 'favorite'} ]; active = 0; diff --git a/site/src/app/components/snippets/directives/snippet.tab.routing.component.html b/site/src/app/components/snippets/directives/snippet.tab.routing.component.html new file mode 100644 index 0000000..5428432 --- /dev/null +++ b/site/src/app/components/snippets/directives/snippet.tab.routing.component.html @@ -0,0 +1,30 @@ +
    + + + diff --git a/site/src/app/components/snippets/directives/snippet.tab.routing.component.ts b/site/src/app/components/snippets/directives/snippet.tab.routing.component.ts new file mode 100644 index 0000000..3a4a246 --- /dev/null +++ b/site/src/app/components/snippets/directives/snippet.tab.routing.component.ts @@ -0,0 +1,26 @@ +import { Component } from '@angular/core'; +//snip:skip +import { forwardRef } from '@angular/core'; +import { AbstractSnippetComponent } from '../abstract.snippet.component'; +//snip:endskip + +@Component({ + //snip:skip + providers: [{provide: AbstractSnippetComponent, useExisting: forwardRef(() => SnippetTabRoutingComponent) }], + //snip:endskip + selector: 'blox-snippet-tab-routing', + templateUrl: './snippet.tab.routing.component.html' +}) +export class SnippetTabRoutingComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { + //snip:skip + constructor() { + super({ + 'html': require('!raw-loader!./snippet.tab.routing.component.html'), + 'typescript': require('!raw-loader!./snippet.tab.routing.component.ts'), + 'app.module.ts': require('!raw-loader!./snippet.tab.routing.module.ts'), + 'page1.ts': require('!raw-loader!./snippet.tab.routing.page1.ts'), + 'page2.ts': require('!raw-loader!./snippet.tab.routing.page2.ts') + }); + } + //snip:endskip +} diff --git a/site/src/app/components/snippets/directives/snippet.tab.routing.module.ts b/site/src/app/components/snippets/directives/snippet.tab.routing.module.ts new file mode 100644 index 0000000..0412696 --- /dev/null +++ b/site/src/app/components/snippets/directives/snippet.tab.routing.module.ts @@ -0,0 +1,57 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; /* snippet-skip-line +import { BrowserModule } from '@angular/platform-browser'; +snippet-skip-line */ +import { Routes, RouterModule } from '@angular/router'; +/* snippet-skip-line +import { MaterialModule } from '@blox/material'; +import { SnippetTabRoutingComponent } from './snippet.tab.routing.component'; +snippet-skip-line */ +import { Page1Component } from './snippet.tab.routing.page1'; // snippet-skip-line +import { Page2Component } from './snippet.tab.routing.page2'; // snippet-skip-line +import { SharedModule } from '../../../shared.module'; /* snippet-skip-line +import { Page1Component } from './page1'; +import { Page2Component } from './page2'; +snippet-skip-line */ + +const routes: Routes = [ + {path: 'page1', component: Page1Component}, + {path: 'page2', component: Page2Component} +]; +/* snippet-skip-line +const routing = RouterModule.forRoot(routes); +snippet-skip-line */ +//snip:skip +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +class routing { } +//snip:endskip + +@NgModule({ + imports: [ +//snip:skip + CommonModule, + SharedModule, +//snip:endskip, +/* snippet-skip-line + BrowserModule, + MaterialModule, +snippet-skip-line */ + routing + ], + declarations: [ +/* snippet-skip-line + SnippetTabRoutingComponent, +snippet-skip-line */ + Page1Component, + Page2Component + ], +/* snippet-skip-line + bootstrap: [ + SnippetTabRoutingComponent + ] +snippet-skip-line */ +}) +export class AppModule { } diff --git a/site/src/app/components/snippets/directives/snippet.tab.routing.page1.ts b/site/src/app/components/snippets/directives/snippet.tab.routing.page1.ts new file mode 100644 index 0000000..650ddde --- /dev/null +++ b/site/src/app/components/snippets/directives/snippet.tab.routing.page1.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'routed-page1', + template: `
    + This is Page 1 +
    +
    + Go to page 2 + ` +}) +export class Page1Component { +} diff --git a/site/src/app/components/snippets/directives/snippet.tab.routing.page2.ts b/site/src/app/components/snippets/directives/snippet.tab.routing.page2.ts new file mode 100644 index 0000000..4ca8baf --- /dev/null +++ b/site/src/app/components/snippets/directives/snippet.tab.routing.page2.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'routed-page2', + template: `
    + This is Page 2! +
    +
    + Go to page 1 + ` +}) +export class Page2Component { +} diff --git a/site/src/app/components/snippets/directives/snippet.tab.scroller.component.html b/site/src/app/components/snippets/directives/snippet.tab.scroller.component.html index 3091cba..7db01df 100644 --- a/site/src/app/components/snippets/directives/snippet.tab.scroller.component.html +++ b/site/src/app/components/snippets/directives/snippet.tab.scroller.component.html @@ -1,20 +1,19 @@
    -
    - +
    {{tabs[active].content}}
    diff --git a/site/src/app/components/snippets/directives/snippet.tab.simple.component.html b/site/src/app/components/snippets/directives/snippet.tab.simple.component.html index c970af0..7db01df 100644 --- a/site/src/app/components/snippets/directives/snippet.tab.simple.component.html +++ b/site/src/app/components/snippets/directives/snippet.tab.simple.component.html @@ -1,6 +1,19 @@
    {{tabs[active].content}}
    diff --git a/site/src/app/components/snippets/directives/snippet.text-field.component.html b/site/src/app/components/snippets/directives/snippet.text-field.component.html index 86971c6..8d46069 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.component.html +++ b/site/src/app/components/snippets/directives/snippet.text-field.component.html @@ -1,43 +1,47 @@
    -
    + + +
    +

    + Help text +

    -

    - Help text -

    +

    -
    + +
    +

    + Input is required + Input requires at least 8 characters +

    -

    - Input is required - Input requires at least 8 characters -

    Modify behaviour of text-fields:

    -
    -
    - -
    - -
    -
    -
    - -
    - -
    diff --git a/site/src/app/components/snippets/directives/snippet.text-field.component.ts b/site/src/app/components/snippets/directives/snippet.text-field.component.ts index fab7b5f..402aaa6 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.component.ts +++ b/site/src/app/components/snippets/directives/snippet.text-field.component.ts @@ -12,13 +12,11 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; templateUrl: './snippet.text-field.component.html' }) export class SnippetTextFieldComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - private _box = true; - private _outlined = false; + outlined = false; rtl = false; disabled = false; required = false; persistent = false; - dense = false; field1: string; field2: string; @@ -34,24 +32,4 @@ export class SnippetTextFieldComponent/*snip:skip*/extends AbstractSnippetCompon get dir() { return this.rtl ? "rtl" : null; } - - get box() { - return this._box; - } - - set box(value: boolean) { - this._box = value; - if (value) - this._outlined = false; - } - - get outlined() { - return this._outlined; - } - - set outlined(value: boolean) { - this._outlined = value; - if (value) - this._box = false; - } } diff --git a/site/src/app/components/snippets/directives/snippet.text-field.icon.component.html b/site/src/app/components/snippets/directives/snippet.text-field.icon.component.html index a5ced1e..0d3b46f 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.icon.component.html +++ b/site/src/app/components/snippets/directives/snippet.text-field.icon.component.html @@ -1,42 +1,46 @@
    -
    +
    -

    - Input with leading icon -

    -
    + [required]="required" autocomplete="off"/> + + + Input 1 + + + Input 1 + +
    +

    + Input with leading icon +

    +
    +

    + + +
    +

    + Input with trailing action icon +

    -

    - Input with trailing action icon -

    Modify behaviour of text-fields:

    -
    -
    - -
    - -
    -
    -
    - -
    - -
    diff --git a/site/src/app/components/snippets/directives/snippet.text-field.icon.component.ts b/site/src/app/components/snippets/directives/snippet.text-field.icon.component.ts index 933213c..ef94d40 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.icon.component.ts +++ b/site/src/app/components/snippets/directives/snippet.text-field.icon.component.ts @@ -12,12 +12,10 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; templateUrl: './snippet.text-field.icon.component.html' }) export class SnippetTextFieldIconComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - private _box = true; - private _outlined = false; + outlined = false; disabled = false; required = false; persistent = false; - dense = false; field1: string; field2: string; @@ -33,24 +31,4 @@ export class SnippetTextFieldIconComponent/*snip:skip*/extends AbstractSnippetCo clearField2() { this.field2 = null; } - - get box() { - return this._box; - } - - set box(value: boolean) { - this._box = value; - if (value) - this._outlined = false; - } - - get outlined() { - return this._outlined; - } - - set outlined(value: boolean) { - this._outlined = value; - if (value) - this._box = false; - } } diff --git a/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.html b/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.html index d4a7fec..c1efaaa 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.html +++ b/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.html @@ -1,23 +1,22 @@

    Multiline input:

    -
    + +
    + minlength="8" [required]="required" rows="8" cols="40" autocomplete="off"> + + + Multiline Input + + +

    Input is required Input requires at least 8 characters

    Modify behaviour of text-field:

    -
    -
    - -
    - -
    diff --git a/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.ts b/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.ts index f4e83c5..88c8a84 100644 --- a/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.ts +++ b/site/src/app/components/snippets/directives/snippet.text-field.textarea.component.ts @@ -16,7 +16,6 @@ export class SnippetTextFieldTextareaComponent/*snip:skip*/extends AbstractSnipp disabled = false; required = false; persistent = false; - dense = false; field1: string; //snip:skip diff --git a/site/src/app/components/snippets/directives/snippet.toolbar.component.html b/site/src/app/components/snippets/directives/snippet.toolbar.component.html deleted file mode 100644 index 2408453..0000000 --- a/site/src/app/components/snippets/directives/snippet.toolbar.component.html +++ /dev/null @@ -1,29 +0,0 @@ -
    -
    -
    -
    -
    - - - - Toolbar -
    -
    - file_download - print - more_vert -
    -
    -
    -
    -

    - Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. - Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. - Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. - Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. -

    -
    -
    -
    diff --git a/site/src/app/components/snippets/directives/snippet.toolbar.component.ts b/site/src/app/components/snippets/directives/snippet.toolbar.component.ts deleted file mode 100644 index ac252e1..0000000 --- a/site/src/app/components/snippets/directives/snippet.toolbar.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component } from '@angular/core'; -//snip:skip -import { forwardRef } from '@angular/core'; -import { AbstractSnippetComponent } from '../abstract.snippet.component'; -//snip:endskip - -@Component({ - //snip:skip - providers: [{provide: AbstractSnippetComponent, useExisting: forwardRef(() => SnippetToolbarComponent)}], - //snip:endskip - selector: 'blox-snippet-toolbar', - templateUrl: './snippet.toolbar.component.html' -}) -export class SnippetToolbarComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - //snip:skip - constructor() { - super({ - 'html': require('!raw-loader!./snippet.toolbar.component.html'), - 'typescript': require('!raw-loader!./snippet.toolbar.component.ts') - }); - } - //snip:endskip -} diff --git a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.html b/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.html deleted file mode 100644 index f668afd..0000000 --- a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.html +++ /dev/null @@ -1,42 +0,0 @@ -
    -
    Toolbar expansion ratio: {{expansionRatio | number : '1.2-2'}}
    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - - - - Toolbar -
    -
    - file_download - print - more_vert -
    -
    -
    -
    -

    - Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. - Donec eu libero sit amet quam egestas semper. - Aenean ultricies mi vitae est. - Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. - Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. -

    -
    -
    -
    diff --git a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.scss b/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.scss deleted file mode 100644 index 11912f5..0000000 --- a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -.blox-snippet-page { - position: relative; - width: 100%; - height: 350px; - overflow-y: auto; -} - -.mdc-toolbar__row:first-child::after { - background-image: url(/assets/img/banners/purple-header-design.jpg); - background-size: cover; - background-position: bottom; -} - -.mdc-toolbar__title { - color: black; -} - -.mdc-toolbar--flexible-space-minimized .mdc-toolbar__title { - color: white; -} diff --git a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.ts b/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.ts deleted file mode 100644 index eac61d9..0000000 --- a/site/src/app/components/snippets/directives/snippet.toolbar.flexible.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Component } from '@angular/core'; -//snip:skip -import { forwardRef } from '@angular/core'; -import { AbstractSnippetComponent } from '../abstract.snippet.component'; -//snip:endskip - -@Component({ - //snip:skip - providers: [{provide: AbstractSnippetComponent, useExisting: forwardRef(() => SnippetToolbarFlexibleComponent)}], - //snip:endskip - selector: 'blox-snippet-toolbar-flexible', - templateUrl: './snippet.toolbar.flexible.component.html', - styleUrls: ['./snippet.toolbar.flexible.component.scss'] -}) -export class SnippetToolbarFlexibleComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - waterfall = true; - expansionRatio: number; - - //snip:skip - constructor() { - super({ - 'html': require('!raw-loader!./snippet.toolbar.flexible.component.html'), - 'scss': require('!raw-loader!./snippet.toolbar.flexible.component.scss'), - 'typescript': require('!raw-loader!./snippet.toolbar.flexible.component.ts') - }); - } - //snip:endskip - - updateExpansionRatio(ratio: number) { - this.expansionRatio = ratio; - } -} diff --git a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.html b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.html index f03b211..99ede9b 100644 --- a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.html +++ b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.html @@ -1,52 +1,55 @@
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    -
    -
    - -
    - -
    - -
    -
    +
    +
    +
    - menu + menu Toolbar
    - file_download - print - more_vert + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +

    Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. diff --git a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.scss b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.scss index 252fcd4..0ecdedd 100644 --- a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.scss +++ b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.scss @@ -1,6 +1,5 @@ .blox-snippet-page { - position: relative; - width: 100%; - height: 350px; - overflow-y: auto; -} \ No newline at end of file + height: 350px; /* snippet-skip-line + height: 100vh; + snippet-skip-line */ +} diff --git a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.ts b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.ts index 8802bc2..bac926a 100644 --- a/site/src/app/components/snippets/directives/snippet.top-app-bar.component.ts +++ b/site/src/app/components/snippets/directives/snippet.top-app-bar.component.ts @@ -13,7 +13,7 @@ import { AbstractSnippetComponent } from '../abstract.snippet.component'; styleUrls: ['./snippet.top-app-bar.component.scss'] }) export class SnippetTopAppBarComponent/*snip:skip*/extends AbstractSnippetComponent/*snip:endskip*/ { - type = 'default'; + type: 'short' | 'fixed' | 'default' = 'default'; prominent = false; dense = false; @@ -24,7 +24,7 @@ export class SnippetTopAppBarComponent/*snip:skip*/extends AbstractSnippetCompon 'html': require('!raw-loader!./snippet.top-app-bar.component.html'), 'scss': require('!raw-loader!./snippet.top-app-bar.component.scss'), // why? it's already in the default stylesheet... 'typescript': require('!raw-loader!./snippet.top-app-bar.component.ts') - }); + }, {}, 'typescript', {noBodyMargins: true}); } //snip:endskip } diff --git a/site/src/app/components/theme/index.ts b/site/src/app/components/theme/index.ts new file mode 100644 index 0000000..b6c315b --- /dev/null +++ b/site/src/app/components/theme/index.ts @@ -0,0 +1 @@ +export * from './theme.switcher.component'; diff --git a/site/src/app/components/theme/theme.switcher.component.html b/site/src/app/components/theme/theme.switcher.component.html new file mode 100644 index 0000000..aba7848 --- /dev/null +++ b/site/src/app/components/theme/theme.switcher.component.html @@ -0,0 +1,17 @@ +

    + +
    +
      +
    • +
      + +
      + {{getName(key)}}   + +
    • +
    +
    +
    diff --git a/site/src/app/components/theme/theme.switcher.component.ts b/site/src/app/components/theme/theme.switcher.component.ts new file mode 100644 index 0000000..f49fee3 --- /dev/null +++ b/site/src/app/components/theme/theme.switcher.component.ts @@ -0,0 +1,38 @@ +import { Component } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { Angulartics2 } from 'angulartics2'; +import { first } from 'rxjs/operators'; +import { ThemeService } from '../../services'; + +@Component({ + selector: 'blox-theme-switcher', + templateUrl: './theme.switcher.component.html' +}) +export class ThemeSwitcherComponent { + static SVG = require('!raw-loader!../../../assets/img/themes/palette.svg').default; + svg: SafeHtml; + theme: string; + themes: string[]; + + constructor(private themeService: ThemeService, private angulartics2: Angulartics2, private sanitizer: DomSanitizer) { + this.themes = themeService.themes; + themeService.theme$.pipe(first()).subscribe(theme => this.theme = theme); + this.svg = this.sanitizer.bypassSecurityTrustHtml(ThemeSwitcherComponent.SVG); + } + + getName(theme: string) { + return this.themeService.getName(theme); + } + + setTheme(theme: string) { + this.theme = theme; + this.themeService.theme = theme; + this.angulartics2.eventTrack.next({ + action: 'theme', + properties: { + category: 'switch', + label: theme + } + }); + } +} diff --git a/site/src/app/messages.json b/site/src/app/messages.json index 92e1049..10dd47b 100644 --- a/site/src/app/messages.json +++ b/site/src/app/messages.json @@ -1,89 +1,86 @@ -{ - "default.title": "Blox Material", - "default.meta.description": "Blox Material, a lightweight Material Design Library for Angular. Open-source and based on Google's Material Components for the Web", - - "components.button.title": "Button", - "components.button.description": "Raised and flat buttons", - "components.button.meta.description": "Button (mdcButton) component of ${default.meta.description}", - "components.card.title": "Card", - "components.card.description": "Various card layout styles", - "components.card.meta.description": "Card (mdcCard) layout styles of ${default.meta.description}", - "components.checkbox.title": "Checkbox", - "components.checkbox.description": "Multi selection controls", - "components.checkbox.meta.description": "Checkbox (mdcCheckbox) component of ${default.meta.description}", - "components.chips.title": "Chips", - "components.chips.description": "Chips for actions, selection, and input", - "components.chips.meta.description": "Chips (mdcChip, mdcChipSet) components of ${default.meta.description}", - "components.dialog.title": "Dialog", - "components.dialog.description": "Modal Dialogs", - "components.dialog.meta.description": "Dialog (mdcDialog) component of ${default.meta.description}", - "components.drawer.title": "Drawers", - "components.drawer.description": "Side navigation menus", - "components.drawer.meta.description": "Drawer (mdcDrawer) components (side navigation) of ${default.meta.description}", - "components.elevation.title": "Elevation", - "components.elevation.description": "Shadow for different elevations", - "components.elevation.meta.description": "Elevation/shadow directives (mdcElevation) for ${default.meta.description}", - "components.fab.title": "Floating Action Button", - "components.fab.description": "Circular buttons for the primary action in an application", - "components.fab.meta.description": "FAB / Floating Action Button (mdcFab) component of ${default.meta.description}", - "components.focus-trap.title": "Focus Trap", - "components.focus-trap.description": "Focus Trap behavior to constrain input focus on modal dialogs", - "components.focus-trap.meta.description": "Focus Trap behavior for ${default.meta.description}", - "components.icon-button.title": "Icon Buttons", - "components.icon-button.description": "Icon Action buttons and Icon Toggle Buttons", - "components.icon-button.meta.description": "Icon Button (mdcIconButton) components of ${default.meta.description}", - "components.icon-toggle.title": "Icon Toggle", - "components.icon-toggle.description": "Toggling icon states", - "components.icon-toggle.meta.description": "Icon Toggle (mdcIconToggle) component of ${default.meta.description}", - "components.linear-progress.title": "Linear Progress", - "components.linear-progress.description": "Indicator for progress on long running tasks", - "components.linear-progress.meta.description": "Linear Progress (mdcLinearProgress) component of ${default.meta.description}", - "components.list.title": "List", - "components.list.description": "Item layouts in lists", - "components.list.meta.description": "List (mdcList) component of ${default.meta.description}", - "components.menu.title": "Menu", - "components.menu.description": "Pop over menus", - "components.menu.meta.description": "Menu (mdcMenu) component of ${default.meta.description}", - "components.radio.title": "Radio Button", - "components.radio.description": "Single selection controls", - "components.radio.meta.description": "Radio Button (mdcRadio) component of ${default.meta.description}", - "components.ripple.title": "Ripple", - "components.ripple.description": "Ink ripple touch feedback effect", - "components.ripple.meta.description": "Ink Ripple (mdcRipple) directives of ${default.meta.description}", - "components.select.title": "Select", - "components.select.description": "Popover selection menus", - "components.select.meta.description": "Select menu (mdcSelect) component of ${default.meta.description}", - "components.slider.title": "Slider", - "components.slider.description": "Range controls", - "components.slider.meta.description": "Slider (mdcSlider) component of ${default.meta.description}", - "components.snackbar.title": "Snackbar", - "components.snackbar.description": "Brief feedback for an action through a message at the bottom of the screen", - "components.snackbar.meta.description": "Snackbar / Toast message (mdcSnackbar) service of ${default.meta.description}", - "components.switch.title": "Switch", - "components.switch.description": "On/off switches", - "components.switch.meta.description": "Swich (mdcSwitch) component of ${default.meta.description}", - "components.tabs.title": "Tabs", - "components.tabs.description": "Tab navigation components", - "components.tabs.meta.description": "Tab navigation (mdcTab) components of ${default.meta.description}", - "components.text-field.title": "Text Field", - "components.text-field.description": "Single and multiline text inputs", - "components.text-field.meta.description": "Text Field (mdcTextField) components of ${default.meta.description}", - "components.toolbar.title": "Toolbar", - "components.toolbar.description": "Headers for holding application title, navigation menu, etc.", - "components.toolbar.meta.description": "Toolbar (mdcToolbar) components of ${default.meta.description}", - "components.top-app-bar.title": "Top App Bar", - "components.top-app-bar.description": "Toolbar for holding branding, title, navigation, and actions", - "components.top-app-bar.meta.description": "Top App Bar (mdcTopAppBar) components of ${default.meta.description}", - "components.utility.title": "Utility", - "components.utility.description": "Supporting directives that provide additional utility functions", - "components.utility.meta.description": "Utility components, directives, and services of ${default.meta.description}", - - "errors.404.title": "Page not Found", - "errors.404.meta.description": "404 - Page not Found on the Blox Material website", - "docs.guides.title": "Guides", - "docs.guides.meta.description": "Guides for ${default.meta.description}", - "guides.gettingStarted.title": "Getting Started", - "guides.gettingStarted.meta.description": "Getting Started Guide for ${default.meta.description}", - "components.overview.title": "Components", - "components.overview.meta.description": "Components Documentation for ${default.meta.description}" -} +{ + "default.title": "Blox Material", + "default.meta.description": "Blox Material, a lightweight Material Design Library for Angular. Open-source and based on Google's Material Components for the Web", + + "components.button.title": "Button", + "components.button.description": "Enhances native button and anchor elements with material styling options", + "components.button.meta.description": "Button (mdcButton) component of ${default.meta.description}", + "components.card.title": "Card", + "components.card.description": "Various card layout styles", + "components.card.meta.description": "Card (mdcCard) layout styles of ${default.meta.description}", + "components.checkbox.title": "Checkbox", + "components.checkbox.description": "Multi selection controls", + "components.checkbox.meta.description": "Checkbox (mdcCheckbox) component of ${default.meta.description}", + "components.chips.title": "Chips", + "components.chips.description": "Lists of values for actions, selection, and input", + "components.chips.meta.description": "Chips (mdcChip, mdcChipSet) components of ${default.meta.description}", + "components.dialog.title": "Dialog", + "components.dialog.description": "Modal Dialogs", + "components.dialog.meta.description": "Dialog (mdcDialog) component of ${default.meta.description}", + "components.drawer.title": "Drawers", + "components.drawer.description": "Side navigation menus", + "components.drawer.meta.description": "Drawer (mdcDrawer) components (side navigation) of ${default.meta.description}", + "components.elevation.title": "Elevation", + "components.elevation.description": "Shadow for different elevations", + "components.elevation.meta.description": "Elevation/shadow directives (mdcElevation) for ${default.meta.description}", + "components.fab.title": "Floating Action Button", + "components.fab.description": "Circular buttons for the primary action in an application", + "components.fab.meta.description": "FAB / Floating Action Button (mdcFab) component of ${default.meta.description}", + "components.focus-trap.title": "Focus Trap", + "components.focus-trap.description": "Focus Trap behavior to constrain input focus on modal dialogs", + "components.focus-trap.meta.description": "Focus Trap behavior for ${default.meta.description}", + "components.icon-button.title": "Icon Buttons", + "components.icon-button.description": "Icon Action buttons and Icon Toggle Buttons", + "components.icon-button.meta.description": "Icon Button (mdcIconButton) components of ${default.meta.description}", + "components.linear-progress.title": "Linear Progress", + "components.linear-progress.description": "Indicator for progress on long running tasks", + "components.linear-progress.meta.description": "Linear Progress (mdcLinearProgress) component of ${default.meta.description}", + "components.list.title": "List", + "components.list.description": "Item layouts in lists", + "components.list.meta.description": "List (mdcList) component of ${default.meta.description}", + "components.menu.title": "Menu", + "components.menu.description": "Pop over menus", + "components.menu.meta.description": "Menu (mdcMenu) component of ${default.meta.description}", + "components.menu-surface.title": "Menu Surface", + "components.menu-surface.description": "Reusable surface that appears above the content of the page", + "components.menu-surface.meta.description": "Menu surface (mdcMenuSurface, mdcMenuAnchor) components of ${default.meta.description}", + "components.radio.title": "Radio Button", + "components.radio.description": "Single selection controls", + "components.radio.meta.description": "Radio Button (mdcRadio) component of ${default.meta.description}", + "components.ripple.title": "Ripple", + "components.ripple.description": "Ink ripple touch feedback effect", + "components.ripple.meta.description": "Ink Ripple (mdcRipple) directives of ${default.meta.description}", + "components.select.title": "Select", + "components.select.description": "Popover selection menus", + "components.select.meta.description": "Select menu (mdcSelect) component of ${default.meta.description}", + "components.slider.title": "Slider", + "components.slider.description": "Range controls", + "components.slider.meta.description": "Slider (mdcSlider) component of ${default.meta.description}", + "components.snackbar.title": "Snackbar", + "components.snackbar.description": "Brief feedback for an action through a message at the bottom of the screen", + "components.snackbar.meta.description": "Snackbar / Toast message (mdcSnackbar) service of ${default.meta.description}", + "components.switch.title": "Switch", + "components.switch.description": "On/off switches", + "components.switch.meta.description": "Swich (mdcSwitch) component of ${default.meta.description}", + "components.tabs.title": "Tabs", + "components.tabs.description": "Tab navigation components", + "components.tabs.meta.description": "Tab navigation (mdcTab) components of ${default.meta.description}", + "components.text-field.title": "Text Field", + "components.text-field.description": "Single and multiline text inputs", + "components.text-field.meta.description": "Text Field (mdcTextField) components of ${default.meta.description}", + "components.top-app-bar.title": "Top App Bar", + "components.top-app-bar.description": "Toolbar for holding branding, title, navigation, and actions", + "components.top-app-bar.meta.description": "Top App Bar (mdcTopAppBar) components of ${default.meta.description}", + "components.utility.title": "Utility", + "components.utility.description": "Supporting directives that provide additional utility functions", + "components.utility.meta.description": "Utility components, directives, and services of ${default.meta.description}", + + "errors.404.title": "Page not Found", + "errors.404.meta.description": "404 - Page not Found on the Blox Material website", + "docs.guides.title": "Guides", + "docs.guides.meta.description": "Guides for ${default.meta.description}", + "guides.gettingStarted.title": "Getting Started", + "guides.gettingStarted.meta.description": "Getting Started Guide for ${default.meta.description}", + "components.overview.title": "Components", + "components.overview.meta.description": "Components Documentation for ${default.meta.description}" +} diff --git a/site/src/app/overview.component.html b/site/src/app/overview.component.html index d3fef63..d302ac7 100644 --- a/site/src/app/overview.component.html +++ b/site/src/app/overview.component.html @@ -1,12 +1,10 @@

    Components, Directives & Services

    -