From 6e6db9abc097b805f492c3752bccaa35df10f988 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Thu, 17 Dec 2020 17:05:38 +0000 Subject: [PATCH] Upstream merge (#543) * Fix permission issue in docker all in one image (#4770) * Update website version, tweak github action (#4771) * Improve the presentation of advanced options in endpoint registration (#4766) * Reduce size of text and icons in page header (#4758) * Use a subtle color for the app page header (#4765) * Reduce size of text and icons in page header * Change app page header color * Add support for no authentication (#4386) * Add supprot for no authentication * Fix backend unit tests * Fix backend test failure * Address PR feedback * Address PR feedback * Fix backend unit test mock * Turn off auto-logout if the user can not log off * Ensure local auth user can edit profile * Fix unit tests Co-authored-by: Richard Cox * Upgrade to Angular 10 (#4724) * update packages pre angular update * Fix TS 4.x error * After ng update @angular/core @angular/cli * update @angular/cdk for ng update @angular/material * after ng update @angular/material * @angular-builders/custom-webpack fix - ngtypecheck.ts part of build not used - import `webpack` not known * Row fix part 1 * ngrx-store-localstorage upgrade * after ng update @ngrx/store * after ng update @swimlane/ngx-charts * After @swimlane/ngx-graph bump * fixes for npm install warnings * row fixes part 2 * Fix most of common js deps, bring in typings - seems the build now complains when bringing in js depedencies ``` CommonJS or AMD dependencies can cause optimization bailouts. For more info see: https://angular.io/guide/build#configuring-commonjs-dependencies ``` - the fix is to allow them, though we should look to moving away int eh future - dependencies are... - moment-timezone.... us - js-yaml.... us - webcola & dagre... ngx-graph - all others come from @cfstratos/ajsf-core * Ensure any cards that override abtract properties with @Input have their get & set * Lint fixes * commas not semi colons in object types * Roll back TableCellCustomComponent naming change change * changes following self review * Roll back ngx-monaco-editor from 10.0.0-beta.1 to 9.0.0 - beta 1 is missing loader.js file, which is loaded by beta 1 - see https://github.com/atularen/ngx-monaco-editor/issues/185#issuecomment-690393639 - also tidy location of monaco assets * Fix unit tests * Fix Application Deploy (problem #2) * Add debig for Application Deploy (problem #1) * Fix Org Spaces List * Fix Space Routes List * Safer api keys test * fix app wall test * Fix Application Wall Tests * More debug for Application Deploy * Add more debugging * Revert "Add more debugging" This reverts commit 41bd7a0042a0293a17db68559b15d3becec58446. * Revert "More debug for Application Deploy" This reverts commit 008e91ed6a832a94fedc5c17ac114dbc28347bd4. * Revert "Add debig for Application Deploy (problem #1)" This reverts commit 14e53c06ce3b2283149ecc61c2d2eec01828366b. * Improve home page view (#4740) * Allow k8s namespaces to be added as favourites * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Fix test imports * Fix unit tests * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Fix unit test * Prevent password show/hide icon from receiving focus (#4776) * Prevent password show/hide icon from receiving focus * Fix lint issues * Create defaults list component (#3987) * Port downstream list filter changes - https://github.com/SUSE/stratos/pull/185 - Apply to feature flag table * Fix e2e tests * Create defaults list component - Intermediate component between simple list and full list - Supply as little config as simple list, all of full list or anywhere in between * Fix test code * Major WIP * Simple change * Trivial change * Trivial Change * WIP * WIP * Tidying up * Avoid chicken & egg linting issue * Fix unit tests * Fix another test * Fix bug where all users were being fetched instead of just those in a cf - best case both cf's connected as admins and call takes a long time - worst case one cf isn't admin and call fails * Fix pick --> omit * Fix typing * Fixes after merge * WIP * Fix unit test * Fixes after merge * Add comments, tidy up * Fix unit tests * Bump gopkg.in/DATA-DOG/go-sqlmock.v1 in /src/jetstream (#4733) Bumps [gopkg.in/DATA-DOG/go-sqlmock.v1](https://github.com/DATA-DOG/go-sqlmock) from 1.3.0 to 1.5.0. - [Release notes](https://github.com/DATA-DOG/go-sqlmock/releases) - [Commits](https://github.com/DATA-DOG/go-sqlmock/compare/v1.3.0...v1.5.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Bump github.com/golang/mock from 1.2.0 to 1.4.4 in /src/jetstream (#4732) Bumps [github.com/golang/mock](https://github.com/golang/mock) from 1.2.0 to 1.4.4. - [Release notes](https://github.com/golang/mock/releases) - [Changelog](https://github.com/golang/mock/blob/master/.goreleaser.yml) - [Commits](https://github.com/golang/mock/compare/v1.2.0...v1.4.4) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix lint issue (#4783) * Endpoint plugins configurable via YAML (#4751) * Add proxy single request API endpoint * Add endpoint plugin generation from a YAML file * Deploy to CF from private GitHub and GitLab repos * Use subtypes for YAML generated endpoints * Nicer YAML format; ignore unknown endpoint types in the DB * Debug issues with mc CLI and minio server (#4790) * Move git tools and some components into their own package (#4752) * Move git tools and some components into their own package - this then becomes more of a git library - includes git - entities (and new git endpoint currently hidden), effects, actions, etc - commit list base items - git scm service and related items * fix unit tests * Update public_api.ts * Update public_api.ts * Fix lint issues Co-authored-by: Neil MacDougall Co-authored-by: Neil MacDougall * Don't fail if we can't access the GitHub API (#4779) * Fix ngDestroy bug on list view component (#4781) * Fix size and position of header notification badge icon (#4778) * Fix size and position of header notification badge icon * Ensure override also applies to dark mode - dark mode brings back in i think specific overrides by material design - ensure our overrides are more specific - flicking between light/dark mode now shows no difference Co-authored-by: Richard Cox * Fix helm endpoint link (#4777) * Prevent password show/hide icon from receiving focus * Fix lint issues * Clicking on a helm repository endpoint should fitler to show it's charts only * Fix for unit test * Address PR feedback * Tidy up and refactor user favorites (#4757) * Allow k8s namespaces to be added as favourites * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * Fix lint issue * Fix lint issue * Fix unit test * Fix merge issue * Fix merge issue * Fix kube favorites not showing and sizing issue * Fix kube endpoint card shortcuts * Reinstate entity validation checks for CF app/org/space * Fix favorite validation * Tidy ups * Fix merge issue * Remove unrelated change * Address PR feedback * Bug fixes * Address PR feedback * Fix link for kubernetes endpoints * Move test docker app off of docker hub to avoid rate limiting (#4802) * Move test docker app off of docker hub to avoid rate limiting * Fix image reference * Handle table cell get/setters better (#4799) - get and set were moved into abstract base class as part of ts bump - we now need to ensure we get/set the correct way - also contains minor cell tidy ups * Fix link for metrics endpoints (#4800) * Fix issue where username/password are not encoded for basic auth (#4796) * Metrics: Ensure Stratos Metrics metadata file is optional (#4801) * Fix link for metrics endpoints * Ensure metrics works with plain Prometheus * Remove test code * Slight optimization in if * Update terminology for SSO Accept List and add to Helm Chart docs (#4797) * Docuement SSO Accept List and rename terminology * Use Allow not Accept * Update log message * Remove debug logging * Document SSO_OPTIONS * Fix double build when using ng serve (#4805) * Fix alignment of no content mesasges on home page view (#4809) * fix unicode rendering in application logstreams (#4808) * User Favorites: Further refactoring to simplify the code base (#4798) * Allow k8s namespaces to be added as favourites * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * Fix lint issue * Fix lint issue * Fix unit test * Fix merge issue * Fix merge issue * Fix kube favorites not showing and sizing issue * Fix kube endpoint card shortcuts * Reinstate entity validation checks for CF app/org/space * Fix favorite validation * Tidy ups * Fix merge issue * Remove unrelated change * Address PR feedback * Bug fixes * User Favorites: More refactoring to simplify * Fix merge issues * More merge fixes * Fix issue with front-end unit tests * Fix unit test issue * Remove unused import * chore: remove trailing comma as this is a non standard (#4815) * remove trailing comma as this is a non standard * remove trailing comma as this is a non standard * remove trailing comma as this is a non standard * Allow backup/restore plugin to be enabled/disabled (#4818) * Home page: Make configurable showing all endpoints or just favorites (#4810) * Fix alignment of no content mesasges on home page view * Allow home view to show all endpoints are just favorites * Fix unit tests * FIx backend test * Changes following review * Fix backend unit test Co-authored-by: Richard Cox * Deploy Applications from Enterprise GitHub and GitLab (#4782) * Frontend for new yaml based git endpoints - register github.com and gitlab.com endpoints and connect with credentials - register and connect to github and gitlan enterprise instances - select these as sources when deploying a cf application * Add proxy single request API endpoint * Add endpoint plugin generation from a YAML file * Deploy to CF from private GitHub and GitLab repos * Use subtypes for YAML generated endpoints * Nicer YAML format; ignore unknown endpoint types in the DB * Fix merge issues and add icon indicator for private repositories * Fix lint issues * Add details component to show username and avatar on endpoint card * Various fixes and improvements * Fix lint issue * Fix merge issues * Unit test fixes * Unit test fix following merge * One more unit test fix * Fix backend unit tests * Fix the deploy types todo (in a verbose way) * Ignore commit id when possible * Fix redeploy stepper * Fix minor bugs in new register git stepper * multiple fixes, remaining todos * update github/gitlab connect readme's, including scope info * In connect helper remove duped header * Fix multiple gitlab issues * Fix deploy app home screen link for github/gitlab with credentials * Ensure app git tab only shows if we have access to repo - can happen if others view app deployed via private repo * Fix clone url & improve error messaging * Improve cf app summary page git info * Fix issue where... - we're waiting for an endpoint that doesn't exist.. in an effect - that endpoint then is created - the effect then fires off the request... long after it should have stopped * Fix multiple gitlab enterprise issues - enterprise gits weren't showing as deploy source types - enterprise gits that weren't connected failed to work (fetching data & deploying) * Fix git enterprise ssl setting, provide hint at time of url required * Show private repo indicator on app git tab * app git tab: handle git fetch failure beter - also rework observables in page * Changes following quick self review * Fix linting * Fixes following testing * Use enum for github string * Ensure Git entities associated with an endpoint are removed on endpoint unregister/disconnect * Fix unit test * Tidy up backend changes * Update app summary page * Show no content message if app git tab cannot show info * display password field instead of text area for token * other changes following review * Fix other issues raised in review (all from single comment) * Fix frontend after updated backend * Apply path escaping fix when url is recreated * Fix some of the e2e tests * Fixes after testing * Fix more e2e tests * Changes following review Co-authored-by: Richard Cox Co-authored-by: Ivan Kapelyukhin * Bump gopkg.in/yaml.v2 from 2.3.0 to 2.4.0 in /src/jetstream (#4817) Bumps [gopkg.in/yaml.v2](https://github.com/go-yaml/yaml) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/go-yaml/yaml/releases) - [Commits](https://github.com/go-yaml/yaml/compare/v2.3.0...v2.4.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Fix ever-increasing array of snackbar references (#4820) * Fix ever-increasing array of snackbar references * Fix isse where latest is always null * Fix snackbar service * K8s add support for more resources (#4780) * k8s: Add support for more resource types in a generic way * Unit test fix * WIP * Fixes for pods view * Tidy ups * Add more resource types * Fix lint issues * Fix build issue * Fix unit test * Unit test fix * Fix unit tests * Fix lint issue * RE-arrange kube entity creation - now assign directly to kube entity catalog - to access custom kube generator resources have to do some funnies in kubernetes-tab-base.component.ts * Fix services in namespace view - kube guid and namespace was mixed up - now follow standard pattern of kube guid then namespace in ctor * Changes following review * Fix unit tests Co-authored-by: Richard Cox * Persist list settings over refresh (#4405) * WIP * Add list reset button & list button tooltips * Few tidy ups, add clear local storage feature * Tweak profile settings section * WIP * WIP * only store pagination sections from lists * Fix clear and auto select multi filter/s on reset * Ingore invalid values * Super basic encryption of pag section * fix reset * Fix max list count & multi-entity selectors stickyness * tidying up * Fix linting * Fix unit tests * Changes following review #1 * Changes following review #2 * Changes following review no. 3 * Fix warning on first load * Fix show org/space e2e failures * improve delete service e2e tests * Ensure list is card mode before waiting to find a card * Remove stray line * Fix linting * Don't use generic url validation for kube endpoints (#4826) - this was recently added - false negative for minikube url (https://192.168.39.159:8443) * Improvement and fix for no-content component (#4827) * Improvements and fixes for no-content component - add colour to improve monotone views on first load - fix issue where no-content header arrow failed to show in production (see https://github.com/angular/angular-cli/issues/17440) * Fix another opacity percentage - seen in import kube table edit endpoint name cell * Bump github.com/mattn/go-sqlite3 from 1.13.0 to 1.14.5 in /src/jetstream (#4816) Bumps [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) from 1.13.0 to 1.14.5. - [Release notes](https://github.com/mattn/go-sqlite3/releases) - [Commits](https://github.com/mattn/go-sqlite3/compare/v1.13.0...v1.14.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Document deployment with an ingress; make ingress host optional (#4793) * Minor Kube Fixes (#4829) * Fix home screen kube card pod link * Ensure reset list filter button also resets helm chart repo filter * Ensure we handle the case where the versions info is unable * Fix link for namespaces Co-authored-by: Neil MacDougall * K8s: More resource support - refinements (#4822) * Allow k8s namespaces to be added as favourites * k8s: Add support for more resource types in a generic way * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Unit test fix * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * WIP * Fixes for pods view * Tidy ups * Add more resource types * Fix lint issue * Fix lint issue * Fix unit test * Fix lint issues * Fix build issue * Fix unit test * Unit test fix * Fix unit tests * More improvements * Numerous improvements * Fix lint issue * RE-arrange kube entity creation - now assign directly to kube entity catalog - to access custom kube generator resources have to do some funnies in kubernetes-tab-base.component.ts * Fix services in namespace view - kube guid and namespace was mixed up - now follow standard pattern of kube guid then namespace in ctor * Fix merge issues * Changes following review * Fix unit tests * Fix merge issue * Fix merge issues * Changes following merge * Changes following merge * Fix merge conflicts * Only show analysis link when enabled * Fix issue favoriting from side panel * Fix expression changed error * Fix expression changed errors * Fix a few minor issues and unit test * Remove old namespace components * Remvoe TODO * Delete fixes - fixes to delete action param - added to delete pods - successEntityHandler doesn't run, so have to manually clear pagination sections * Fix delete ns - ensure delete action has correct guid - ensure response has kube guid * Fix expanding pod row * Fix show of analysis in namespace resource viewer * Fix fav namespace link * Fix PR issues Co-authored-by: Richard Cox * Add additional information to new kube resource tables (#4825) * Allow k8s namespaces to be added as favourites * k8s: Add support for more resource types in a generic way * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Unit test fix * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * WIP * Fixes for pods view * Tidy ups * Add more resource types * Fix lint issue * Fix lint issue * Fix unit test * Fix lint issues * Fix build issue * Fix unit test * Unit test fix * Fix unit tests * More improvements * Numerous improvements * Fix lint issue * RE-arrange kube entity creation - now assign directly to kube entity catalog - to access custom kube generator resources have to do some funnies in kubernetes-tab-base.component.ts * Fix services in namespace view - kube guid and namespace was mixed up - now follow standard pattern of kube guid then namespace in ctor * Fix merge issues * Changes following review * Fix unit tests * Fix merge issue * Fix merge issues * Changes following merge * Changes following merge * Add additional information to new kube resource tables * Fix merge conflicts * Only show analysis link when enabled * Fix issue favoriting from side panel * Fix expression changed error * Fix expression changed errors * Fix a few minor issues and unit test * Remove old namespace components * Remvoe TODO * Fix merge issue * Fix PR issues * Delete fixes - fixes to delete action param - added to delete pods - successEntityHandler doesn't run, so have to manually clear pagination sections * Fix delete ns - ensure delete action has correct guid - ensure response has kube guid * Don't use generic url validation for kube endpoints (#4826) - this was recently added - false negative for minikube url (https://192.168.39.159:8443) * Improvement and fix for no-content component (#4827) * Improvements and fixes for no-content component - add colour to improve monotone views on first load - fix issue where no-content header arrow failed to show in production (see https://github.com/angular/angular-cli/issues/17440) * Fix another opacity percentage - seen in import kube table edit endpoint name cell * Bump github.com/mattn/go-sqlite3 from 1.13.0 to 1.14.5 in /src/jetstream (#4816) Bumps [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) from 1.13.0 to 1.14.5. - [Release notes](https://github.com/mattn/go-sqlite3/releases) - [Commits](https://github.com/mattn/go-sqlite3/compare/v1.13.0...v1.14.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Document deployment with an ingress; make ingress host optional (#4793) * Minor Kube Fixes (#4829) * Fix home screen kube card pod link * Ensure reset list filter button also resets helm chart repo filter * Ensure we handle the case where the versions info is unable * Fix link for namespaces Co-authored-by: Neil MacDougall * Fix expanding pod row * Fix show of analysis in namespace resource viewer * Fix fav namespace link Co-authored-by: Neil MacDougall Co-authored-by: Neil MacDougall Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Ivan Kapelyukhin Co-authored-by: Neil MacDougall * Improve SSO documentation with detailed UAA setup (#4833) Document how to properly setup UAA client in production environment, with proper listing in login home page. * Add additional kube resources to Workload page (#4830) * Allow k8s namespaces to be added as favourites * k8s: Add support for more resource types in a generic way * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Unit test fix * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * WIP * Fixes for pods view * Tidy ups * Add more resource types * Fix lint issue * Fix lint issue * Fix unit test * Fix lint issues * Fix build issue * Fix unit test * Unit test fix * Fix unit tests * More improvements * Numerous improvements * Fix lint issue * RE-arrange kube entity creation - now assign directly to kube entity catalog - to access custom kube generator resources have to do some funnies in kubernetes-tab-base.component.ts * Fix services in namespace view - kube guid and namespace was mixed up - now follow standard pattern of kube guid then namespace in ctor * Fix merge issues * Changes following review * Fix unit tests * Fix merge issue * Fix merge issues * Changes following merge * Changes following merge * Fix merge conflicts * Only show analysis link when enabled * Fix issue favoriting from side panel * Fix expression changed error * Fix expression changed errors * Fix a few minor issues and unit test * Remove old namespace components * Remvoe TODO * Add additional kube resources to Workload page Two small todos left - tidy up process in helm-release-socket-service - switch service and pods view over to new process and remove old components/files * Convert workload pods and services view to standard resource views * Tidy up HelmReleaseSocketService * Delete fixes - fixes to delete action param - added to delete pods - successEntityHandler doesn't run, so have to manually clear pagination sections * Fix delete ns - ensure delete action has correct guid - ensure response has kube guid * Fix expanding pod row * Fix show of analysis in namespace resource viewer * Fix fav namespace link * Fix PR issues * remove fluff from kube generator * Fixes post merge * Add additional information to new kube resource tables (#4825) * Allow k8s namespaces to be added as favourites * k8s: Add support for more resource types in a generic way * Improve the home page * Fix lint issue * Tweaks and refactoring * Add separator to layout menu * Improve incremental loading * Various tidyups and improvements * Tidy ups and improvemts to async loading * Fix progress spinner alignment * Unscubribe * Minor bug fixes and a few tidy ups * Further tidy ups * Fix front end unit tests * Unit test fix * Further unit tests fixes * Endpoint card unit test fixes * Fix unit tests * Tidy up favorite card * Further refinement to the UI * Fix missing dates from recents on CF view * Get app deploy from home screen working * Add message for when no connected endpoints * Unit test fixes * Kubernetes Home Card unit test fixes * Fix unit test error * Move components to remove dependency on large shared module * Fix unit test and add deploy tiles to CF Home Card * Fix word wrap on favorite name * Add tool tip * Style tidy ups * Minor tidy ups * Check favorites exists before navigating to them * Fix test imports * First round of tidy ups of the user favorites code * Further refactor to reduce the complexity of user favorites * Fix unit tests * Allow Kubernetes namespaces to be favorited * Fix duplicate import * Tidy ups * e2e Debugging * Fix for org delete e2e test * E2e Test fix * Refactor out common entity operator * Slight refactor * Fix frontend unit tests * Unit test fix * Address PR feedback so far * Address PR feedback * Fix connected endpoint state check on home screen * Address PR feedback * Restore apps link * Improve typing * Fix undefined error * Fix unit test * Fix ordering issue * Add a default home card * Fix frong end lint issues * Merge fixes * Fix unit tests * WIP * Fixes for pods view * Tidy ups * Add more resource types * Fix lint issue * Fix lint issue * Fix unit test * Fix lint issues * Fix build issue * Fix unit test * Unit test fix * Fix unit tests * More improvements * Numerous improvements * Fix lint issue * RE-arrange kube entity creation - now assign directly to kube entity catalog - to access custom kube generator resources have to do some funnies in kubernetes-tab-base.component.ts * Fix services in namespace view - kube guid and namespace was mixed up - now follow standard pattern of kube guid then namespace in ctor * Fix merge issues * Changes following review * Fix unit tests * Fix merge issue * Fix merge issues * Changes following merge * Changes following merge * Add additional information to new kube resource tables * Fix merge conflicts * Only show analysis link when enabled * Fix issue favoriting from side panel * Fix expression changed error * Fix expression changed errors * Fix a few minor issues and unit test * Remove old namespace components * Remvoe TODO * Fix merge issue * Fix PR issues * Delete fixes - fixes to delete action param - added to delete pods - successEntityHandler doesn't run, so have to manually clear pagination sections * Fix delete ns - ensure delete action has correct guid - ensure response has kube guid * Don't use generic url validation for kube endpoints (#4826) - this was recently added - false negative for minikube url (https://192.168.39.159:8443) * Improvement and fix for no-content component (#4827) * Improvements and fixes for no-content component - add colour to improve monotone views on first load - fix issue where no-content header arrow failed to show in production (see https://github.com/angular/angular-cli/issues/17440) * Fix another opacity percentage - seen in import kube table edit endpoint name cell * Bump github.com/mattn/go-sqlite3 from 1.13.0 to 1.14.5 in /src/jetstream (#4816) Bumps [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) from 1.13.0 to 1.14.5. - [Release notes](https://github.com/mattn/go-sqlite3/releases) - [Commits](https://github.com/mattn/go-sqlite3/compare/v1.13.0...v1.14.5) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> * Document deployment with an ingress; make ingress host optional (#4793) * Minor Kube Fixes (#4829) * Fix home screen kube card pod link * Ensure reset list filter button also resets helm chart repo filter * Ensure we handle the case where the versions info is unable * Fix link for namespaces Co-authored-by: Neil MacDougall * Fix expanding pod row * Fix show of analysis in namespace resource viewer * Fix fav namespace link Co-authored-by: Neil MacDougall Co-authored-by: Neil MacDougall Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Ivan Kapelyukhin Co-authored-by: Neil MacDougall * Add comment after review Co-authored-by: Neil MacDougall Co-authored-by: Neil MacDougall Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Ivan Kapelyukhin Co-authored-by: Neil MacDougall * Electron update (#4811) * Add supprot for no authentication * Electron WIP * Electron app WIP * Add packaging * Wait for backend to start * Non-functional tidy ups * Move desktop theme into desktop-extentions - see run.sh for some enable/disable shinanigans * Disable auto-log out when there's no auth - need to tidy up how 'no auth' is determined * Add Local flag * Remove jetstream binary * Allow SessionExpiry to be customised * Add SESSION_STORE_EXPIRY customisation * Re-enable loggin service - should now be a no-op for no auth scenario (session never expires) * Logging change * Disable edit of local endpoints - all the infomation is dynamically created * Add local endpoint indication * Allow packages to only supply routing module * Split out profile settings into it's own component * Add back in dark mode * Add desktop settings page accessible via menu * Fix SESSION_STORE_EXPIRY * Add icon * Add correct icon * Add blank login page * Add basic snackbar integration - Send OS notification instead of snackbar (only covers snackbar service, not all snackbar ref uses) - brings in ngx-electron to get easy isElectron test and access to ipcRenderer - ignores 'return' type used to navigate to area of app * Add a 'install' nav item into desktop-extensions - this can be split out into a separate package * Tweaks * Tweak endpoint card * Remove unused loadsh * A fwe tweaks. Better about page * Add file watch * Add auto-update support * Bug fixes for cf * Only listen for endpointsChanged when running with eletron * Mirror CF Disconnect/Unregister in config * Add warning when disconnecting/unregistering local endpoints * Improve look of DMG * Tweak alert badge. Remove copyright icon * Remove info logging that was debug * Tweaks * Persist last location, start from location * Fix path * Minor tweaks * Tweaks * Fix lint issues * Fix compilation issues * Fix backend test compilation * Fix front-end unit tests * Add test coverage file * Fix build issue * Fix merge issue * Fix backend unit tests * Fix setting bug and read version from file * Exclude desktop extension by default * More improvements * Improvements for initial checkout * Tweak to clean checkout experience * Tidy up * Bump version number to 4.4.0 * Fix bug that broke id on user menu button * Fixes following merge * Fix deploy app snack bar * Ensure backend plugin is included * Add kube desktop support * Fix unit tests * Fix backend build issue * A few minor fixes * Fix issue reading version file Co-authored-by: Richard Cox * Bump ini from 1.3.5 to 1.3.7 in /electron (#4837) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update versions and change log (#4835) * Fix edit profile button visibility (#4839) - broken as part of electron changes - canEdit$ was incorrectly removed * Ensure initial/default plugins.yaml is included in build (#4840) * Ensure we copy plugins.yaml for AIO and Cloud Foundry (#4841) Co-authored-by: Richard Cox Co-authored-by: Richard Cox Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Ivan Kapelyukhin Co-authored-by: Geoffrey J. Teale Co-authored-by: pg2000 Co-authored-by: Benjamin Gandon Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../workflows/documentation-versioning.yml | 2 +- .gitignore | 11 +- CHANGELOG.md | 29 +- angular.json | 59 + deploy/Dockerfile.all-in-one | 28 +- deploy/Dockerfile.bk | 1 + deploy/ci/travis/e2e-mc-helper.sh | 2 - deploy/ci/travis/run-e2e-tests.sh | 2 + deploy/cloud-foundry/build.sh | 3 + deploy/kubernetes/console/README.md | 36 +- deploy/kubernetes/console/templates/NOTES.txt | 13 +- .../console/templates/__helpers.tpl | 2 - .../console/templates/deployment.yaml | 6 +- .../kubernetes/console/templates/ingress.yaml | 11 +- electron/README.md | 27 + electron/VolumeIcon.icns | Bin 0 -> 224817 bytes electron/about.html | 76 + electron/background.png | Bin 0 -> 222465 bytes electron/build.sh | 66 + electron/config.properties | 71 + electron/electron-store.js | 48 + electron/freeport.js | 59 + electron/icon.icns | Bin 0 -> 224817 bytes electron/icon.png | Bin 0 -> 4452 bytes electron/index.js | 271 + electron/logo.png | Bin 0 -> 93628 bytes electron/menu.js | 232 + electron/package-lock.json | 5767 +++++++++++++ electron/package.json | 85 + electron/package.sh | 18 + electron/prep-backend.sh | 10 + electron/run.sh | 10 + electron/stratos.yaml | 2 + package-lock.json | 7196 ++++++++--------- package.json | 87 +- .../edit-autoscaler-credential.component.ts | 2 +- .../edit-autoscaler-policy-base-step.ts | 7 +- .../edit-autoscaler-policy-step1.component.ts | 10 +- .../edit-autoscaler-policy-step2.component.ts | 18 +- .../edit-autoscaler-policy-step3.component.ts | 16 +- .../edit-autoscaler-policy-step4.component.ts | 20 +- ...-autoscaler-metric-chart-card.component.ts | 1 + .../src/store/autoscaler-entity-generator.ts | 3 +- .../src/store/autoscaler.store.module.ts | 56 - .../packages/cloud-foundry/package.json | 5 +- .../src/actions/application.actions.ts | 4 +- .../actions/deploy-applications.actions.ts | 84 +- .../src/actions/github.actions.ts | 16 - .../src/actions/relations-actions.ts | 2 +- .../src/actions/service-instances.actions.ts | 2 +- .../cloud-foundry/src/cf-api.types.ts | 4 +- .../cloud-foundry/src/cf-entity-catalog.ts | 79 +- .../cloud-foundry/src/cf-entity-factory.ts | 14 +- .../cloud-foundry/src/cf-entity-generator.ts | 280 +- .../cloud-foundry/src/cf-entity-types.ts | 7 - .../cloud-foundry/src/cf-favorites-helpers.ts | 25 - .../cloud-foundry/src/cf-metadata-types.ts | 21 - .../src/cloud-foundry-package.module.ts | 2 - .../src/cloud-foundry-routing.module.ts | 4 +- .../src/cloud-foundry-test.module.ts | 9 +- .../application-stats.action-builders.ts | 2 +- .../domin.action-builder.ts | 4 +- .../feature-flag.action-builder.ts | 2 +- .../git-action-builder.ts | 84 - ...service-plan-visibility.action-builders.ts | 2 +- .../service-plan.action-builders.ts | 4 +- .../space-quota.action-builders.ts | 10 +- .../space.action-builders.ts | 12 +- .../user-provided-service.action-builders.ts | 2 +- .../application-delete.component.ts | 10 +- ...te-instances-routes-list-config.service.ts | 4 +- .../application-wall.component.html | 1 + .../application-wall.component.spec.ts | 10 + .../application-wall.component.ts | 39 +- .../applications/application.service.spec.ts | 4 +- .../applications/application.service.ts | 6 +- .../application-polling.service.ts | 2 +- .../application-tabs-base.component.spec.ts | 2 +- .../application-tabs-base.component.ts | 15 +- .../build-tab/application-env-vars.service.ts | 1 + .../tabs/build-tab/build-tab.component.html | 41 +- .../tabs/build-tab/build-tab.component.scss | 10 + .../build-tab/build-tab.component.spec.ts | 2 +- .../tabs/build-tab/build-tab.component.ts | 67 +- .../tabs/gitscm-tab/gitscm-tab.component.html | 186 +- .../tabs/gitscm-tab/gitscm-tab.component.scss | 21 +- .../gitscm-tab/gitscm-tab.component.spec.ts | 10 +- .../tabs/gitscm-tab/gitscm-tab.component.ts | 191 +- .../log-stream-tab.component.ts | 2 +- .../applications/applications.module.ts | 4 +- .../applications/applications.routing.ts | 11 + .../create-application-step3.component.ts | 12 +- .../create-application.component.ts | 8 +- .../deploy-application-deployer.ts | 26 +- .../commit-list-wrapper.component.spec.ts | 4 +- .../commit-list-wrapper.component.ts | 3 +- .../deploy-application-step2-1.component.ts | 8 +- .../deploy-application-step2.component.html | 10 +- .../deploy-application-step2.component.scss | 15 + ...deploy-application-step2.component.spec.ts | 4 +- .../deploy-application-step2.component.ts | 84 +- .../deploy-application-step3.component.ts | 14 +- .../deploy-application-steps.types.ts | 98 +- .../deploy-application.component.html | 6 +- .../deploy-application.component.spec.ts | 2 +- .../deploy-application.component.ts | 28 +- .../github-project-exists.directive.spec.ts | 4 +- .../github-project-exists.directive.ts | 14 +- .../new-application-base-step.component.html | 3 +- .../new-application-base-step.component.ts | 61 +- .../routes/add-routes/add-routes.component.ts | 4 +- .../create-organization-step.component.ts | 8 +- .../create-space-step.component.ts | 8 +- .../cf/cloud-foundry-section.module.ts | 4 +- .../cloud-foundry-tabs-base.component.ts | 6 +- .../edit-space-step.component.ts | 6 +- .../cloud-foundry-endpoint.service.ts | 34 +- .../cloud-foundry-organization.service.ts | 2 +- ...oud-foundry-organization-base.component.ts | 12 +- .../cloud-foundry-space-base.component.ts | 7 +- ...cloud-foundry-space-summary.component.html | 3 +- ...ud-foundry-space-summary.component.spec.ts | 10 +- ...oundry-organization-summary.component.html | 1 + ...dry-organization-summary.component.spec.ts | 8 +- ...cloud-foundry-organizations.component.html | 4 +- ...ud-foundry-organizations.component.spec.ts | 3 +- .../cloud-foundry-organizations.component.ts | 65 +- .../cloud-foundry-quotas.component.spec.ts | 3 +- .../cloud-foundry-summary-tab.component.html | 1 + ...loud-foundry-summary-tab.component.spec.ts | 8 +- .../cf/user-invites/user-invite.service.ts | 6 +- .../cf/users/manage-users/cf-roles.service.ts | 8 +- .../manage-users-modify.component.ts | 2 +- .../manage-users-set-usernames.component.ts | 4 +- .../card-cf-recent-apps.component.html | 30 + .../card-cf-recent-apps.component.scss | 13 +- .../card-cf-recent-apps.component.spec.ts | 16 +- .../card-cf-recent-apps.component.ts | 103 + .../compact-app-card.component.html | 17 + .../compact-app-card.component.scss | 79 + .../compact-app-card.component.spec.ts | 10 +- .../compact-app-card.component.ts | 30 +- .../cfhome-card/cfhome-card.component.html | 35 + .../cfhome-card/cfhome-card.component.scss | 30 + .../cfhome-card/cfhome-card.component.spec.ts | 31 + .../home/cfhome-card/cfhome-card.component.ts | 202 + .../home/cfhome-card/cfhome-card.module.ts | 42 + .../service-tabs-base.component.ts | 6 +- .../service-catalog/services-helper.ts | 6 +- .../service-catalog/services.service.ts | 14 +- .../services-wall.component.html | 1 + .../services-wall/services-wall.component.ts | 25 +- .../services/services-wall.service.ts | 8 +- .../packages/cloud-foundry/src/public_api.ts | 2 +- .../src/shared/cf-shared.module.ts | 13 - ...dd-service-instance-base-step.component.ts | 4 +- .../add-service-instance/csi-mode.service.ts | 2 +- .../specify-details-step.component.ts | 22 +- ...specify-user-provided-details.component.ts | 10 +- .../card-app-instances.component.ts | 2 +- .../card-cf-recent-apps.component.html | 17 - .../card-cf-recent-apps.component.ts | 57 - .../compact-app-card.component.html | 7 - .../compact-app-card.component.scss | 22 - .../card-cf-space-details.component.ts | 2 +- .../service-broker-card.component.ts | 2 +- .../create-application-step1.component.ts | 2 +- .../cf-app-instances-config.service.ts | 2 +- .../cf-app-instances-data-source.ts | 2 +- .../table-cell-cf-cell.component.ts | 5 +- .../cf-app-map-routes-list-config.service.ts | 2 +- .../cf-app-routes-list-config-base.ts | 2 +- .../table-cell-edit-variable.component.ts | 3 +- .../list-types/app/card/card-app.component.ts | 17 +- .../list-types/app/cf-app-config.service.ts | 3 +- ...ll-app-cforgspace-header.component.spec.ts | 13 +- ...able-cell-app-cforgspace.component.spec.ts | 22 +- .../table-cell-app-cforgspace.component.ts | 1 + .../table-cell-app-status.component.spec.ts | 8 +- .../table-cell-app-status.component.ts | 19 +- .../cf-buildpacks-data-source.ts | 2 +- .../table-cell-confirm-org-space.component.ts | 1 + .../cf-events/cf-events-config.service.ts | 8 +- .../table-cell-event-actee.component.ts | 21 +- .../table-cell-event-timestamp.component.ts | 4 +- .../table-cell-event-type.component.ts | 4 +- ...cell-feature-flag-description.component.ts | 1 + ...table-cell-feature-flag-state.component.ts | 6 +- .../cf-org-card/cf-org-card.component.ts | 7 +- .../cf-orgs/cf-orgs-data-source.service.ts | 29 - .../cf-orgs-list-config.service.spec.ts | 21 - .../cf-orgs/cf-orgs-list-config.service.ts | 52 - .../table-cell-quota.component.ts | 2 +- .../cf-routes-list-config.service.ts | 12 +- ...able-cell-route-apps-attached.component.ts | 6 +- .../cf-service-card.component.ts | 7 +- .../table-cell-service-active.component.ts | 12 +- .../table-cell-service-bindable.component.ts | 11 +- .../table-cell-service-broker.component.ts | 16 +- ...e-cell-service-cf-breadcrumbs.component.ts | 1 + .../table-cell-service-provider.component.ts | 5 +- ...table-cell-service-references.component.ts | 5 +- .../table-cell-service-tags.component.ts | 8 +- .../cf-space-routes-data-source.ts | 8 +- ...ervice-instance-apps-attached.component.ts | 6 +- ...le-cell-service-instance-tags.component.ts | 6 +- .../table-cell-service-last-op.component.ts | 8 +- .../table-cell-service.component.ts | 10 +- .../table-cell-space-name.component.ts | 7 +- .../cf-space-card/cf-space-card.component.ts | 7 +- .../cf-spaces-list-config.service.spec.ts | 14 +- .../table-cell-select-org.component.ts | 4 +- .../list-types/cf-users/cf-permission-cell.ts | 2 + .../cf-space-permission-cell.component.ts | 2 +- ...hub-commits-list-config-app-tab.service.ts | 126 +- ...thub-commits-list-config-deploy.service.ts | 10 +- ...table-cell-service-plan-price.component.ts | 5 +- .../service-instance-card.component.ts | 14 +- ...vice-instances-wall-list-config.service.ts | 1 + ...rovided-service-instance-card.component.ts | 7 +- .../schema-form/schema-form.component.ts | 6 +- .../cf-org-space-service.service.ts | 114 +- .../shared/data-services/cf-user.service.ts | 20 +- .../shared/data-services/scm/github-scm.ts | 110 - .../shared/data-services/scm/gitlab-scm.ts | 186 - .../app-name-unique.directive.spec.ts | 2 +- .../app-name-unique.directive.ts | 2 +- ...permissions-and-cfchecker.service.spec.ts} | 29 +- .../src/store/cloud-foundry.store.module.ts | 7 +- .../store/effects/app-variables.effects.ts | 2 +- .../src/store/effects/app.effects.ts | 2 +- .../src/store/effects/deploy-app.effects.ts | 189 +- .../src/store/effects/github.effects.ts | 62 - .../src/store/effects/update-app-effects.ts | 5 +- .../current-cf-user-roles.reducer.ts | 6 +- .../types/cf-current-user-roles.types.ts | 2 +- .../store/types/deploy-application.types.ts | 5 +- .../src/store/types/git.types.ts | 42 - .../src/store/types/github.types.ts | 39 - .../cf-user-permissions-checkers.ts | 6 +- .../user-permissions/cf-user-roles-fetch.ts | 4 +- .../application-service-helper.ts | 2 +- .../packages/core/sass/_all-theme.scss | 14 +- .../packages/core/sass/mat-desktop.scss | 20 + .../packages/core/src/app.component.spec.ts | 4 +- .../packages/core/src/app.component.ts | 5 + src/frontend/packages/core/src/app.module.ts | 20 +- .../src/core/apiKey-auth-guard.service.ts | 2 +- .../packages/core/src/core/core.types.ts | 15 +- .../packages/core/src/core/endpoint-auth.ts | 40 +- .../core/src/core/endpoints.service.ts | 25 +- .../entity-favorite-star.component.html | 3 +- .../entity-favorite-star.component.scss | 13 + .../entity-favorite-star.component.spec.ts | 11 +- .../entity-favorite-star.component.ts | 6 +- .../src/core/extension/extension-service.ts | 2 +- .../packages/core/src/core/md.module.ts | 10 +- .../current-user-permissions.service.spec.ts | 3 +- .../current-user-permissions.types.ts | 4 +- .../stratos-user-permissions.checker.ts | 22 +- .../show-hide-button.component.html | 2 +- .../core/src/core/user-profile.service.ts | 2 +- .../src/environments/environment.desktop.ts | 12 + .../core/src/environments/environment.prod.ts | 5 +- .../core/src/environments/environment.ts | 5 +- .../about/about-page/about-page.component.ts | 2 +- .../add-api-key-dialog.component.ts | 6 +- .../dashboard-base.component.html | 7 +- .../dashboard-base.component.scss | 6 +- .../dashboard-base.component.ts | 11 +- .../features/dashboard/dashboard.module.ts | 6 +- .../side-nav/side-nav.component.html | 3 +- .../dashboard/side-nav/side-nav.component.ts | 18 +- .../restore-endpoints.service.ts | 4 +- .../restore-endpoints.component.ts | 4 +- .../credentials-auth-form.component.html | 4 +- .../credentials-auth-form.component.ts | 16 + .../token-endpoint.component.html | 12 + .../token-endpoint.component.scss | 18 + .../token-endpoint.component.spec.ts | 25 + .../token-endpoint.component.ts | 17 + .../connect-endpoint-dialog.component.html | 8 +- .../connect-endpoint-dialog.component.ts | 20 +- .../connect-endpoint.component.ts | 13 +- .../src/features/endpoints/connect.service.ts | 5 +- .../base-endpoint-tile-manager.ts | 165 + .../create-endpoint-base-step.component.ts | 155 +- .../create-endpoint-cf-step-1.component.html | 58 +- .../create-endpoint-cf-step-1.component.scss | 37 + .../create-endpoint-cf-step-1.component.ts | 75 +- .../create-endpoint-connect.component.ts | 4 +- .../create-endpoint.component.ts | 16 +- .../create-endpoint/create-endpoint.module.ts | 2 + .../edit-endpoint-step.component.ts | 6 +- .../endpoints-page.component.html | 2 +- .../endpoints-page.component.ts | 18 +- .../features/endpoints/endpoints.module.ts | 5 +- .../error-page/error-page.component.ts | 2 +- .../core/src/features/home/home.module.ts | 25 +- .../core/src/features/home/home.types.ts | 28 + ...ult-endpoint-home-component.component.html | 7 + ...ult-endpoint-home-component.component.scss | 14 + ...-endpoint-home-component.component.spec.ts | 25 + ...fault-endpoint-home-component.component.ts | 38 + .../favorites-meta-card.component.html | 11 + .../favorites-meta-card.component.scss | 44 + .../favorites-meta-card.component.spec.ts | 2 +- .../favorites-meta-card.component.theme.scss | 0 .../favorites-meta-card.component.ts | 76 + .../favorites-side-panel.component.html | 5 + .../favorites-side-panel.component.scss | 7 + .../favorites-side-panel.component.spec.ts | 25 + .../favorites-side-panel.component.ts | 21 + .../home-page-endpoint-card.component.html | 53 + .../home-page-endpoint-card.component.scss | 123 + .../home-page-endpoint-card.component.spec.ts | 50 + ...me-page-endpoint-card.component.theme.scss | 16 + .../home-page-endpoint-card.component.ts | 250 + .../home/home/home-page.component.html | 53 +- .../home/home/home-page.component.scss | 76 +- .../home/home/home-page.component.spec.ts | 4 +- .../home/home/home-page.component.theme.scss | 3 + .../features/home/home/home-page.component.ts | 337 +- .../home-shortcuts.component.html | 9 + .../home-shortcuts.component.scss | 23 + .../home-shortcuts.component.spec.ts | 25 + .../home-shortcuts.component.ts | 14 + .../login/login-page/login-page.component.ts | 2 +- .../logout-page/logout-page.component.ts | 2 +- .../metrics-endpoint-details.component.ts | 1 + .../src/features/metrics/metrics.helpers.ts | 4 +- .../metrics/services/metrics-service.ts | 2 +- .../profile-info/profile-info.component.html | 68 +- .../profile-info/profile-info.component.scss | 39 +- .../profile-info/profile-info.component.ts | 65 +- .../core/src/logged-in.service.spec.ts | 2 + .../packages/core/src/logged-in.service.ts | 47 +- src/frontend/packages/core/src/public-api.ts | 4 +- .../app-action-monitor.component.ts | 8 +- .../card-number-metric.component.html | 2 +- .../card-number-metric.component.scss | 17 + .../card-number-metric.component.theme.scss | 6 + .../card-number-metric.component.ts | 1 + .../favorites-entity-list.component.html | 37 - .../favorites-entity-list.component.scss | 42 - .../favorites-entity-list.component.spec.ts | 30 - .../favorites-entity-list.component.ts | 155 - .../favorites-global-list.component.html | 23 - .../favorites-global-list.component.scss | 23 - ...favorites-global-list.component.theme.scss | 8 - .../favorites-global-list.component.ts | 61 - .../favorites-meta-card.component.html | 65 - .../favorites-meta-card.component.scss | 93 - .../favorites-meta-card.component.ts | 163 - .../json-viewer/json-viewer.component.html | 2 +- .../json-viewer/json-viewer.component.scss | 15 +- .../json-viewer/json-viewer.component.ts | 8 +- .../list-data-source-config.ts | 1 - .../list-data-source.ts | 11 + .../list-pagination-controller.ts | 20 +- .../meta-card-base/meta-card.component.html | 2 +- .../meta-card-base/meta-card.component.scss | 14 + .../meta-card.component.spec.ts | 14 - .../meta-card.component.theme.scss | 18 + .../meta-card-base/meta-card.component.ts | 11 +- .../entity-list-view.component.html | 1 + .../entity-list-view.component.scss} | 0 .../entity-list-view.component.spec.ts | 35 + .../entity-list-view.component.ts | 24 + .../helpers/action-or-config-helpers.ts | 119 + .../helpers/entity-catalogue-list-config.ts | 55 + .../helpers}/list-host.directive.ts | 0 .../list-config-provider.types.ts | 11 + .../action-list-config-provider.ts | 19 + ...n-or-entity-config-list-config-provider.ts | 82 + .../entity-config-list-config-provider.ts | 19 + .../list-view/list-view.component.html} | 0 .../list-view/list-view.component.scss} | 0 .../list-view/list-view.component.spec.ts | 41 + .../list-view/list-view.component.ts | 59 + .../app-table-cell-default.component.html | 4 +- .../app-table-cell-default.component.ts | 5 +- .../table-cell-actions.component.ts | 9 +- .../table-cell-boolean-indicator.component.ts | 12 +- .../table-cell-edit.component.scss | 2 +- .../table-cell-edit.component.ts | 16 +- .../table-cell-expander.component.ts | 20 +- .../table-cell-favorite.component.ts | 20 +- .../table-cell-icon.component.ts | 16 +- .../table-cell-radio.component.ts | 5 +- ...ell-request-monitor-icon.component.spec.ts | 12 +- ...ble-cell-request-monitor-icon.component.ts | 25 +- .../table-cell-side-panel.component.ts | 12 +- .../apiKeys/apiKey-list-config.service.ts | 2 +- .../endpoint-card/endpoint-card.component.ts | 32 +- .../endpoint/endpoint-list.helpers.ts | 5 +- .../endpoint/endpoints-list-config.service.ts | 10 +- .../table-cell-endpoint-address.component.ts | 1 + .../table-cell-endpoint-details.component.ts | 9 +- .../table-cell-endpoint-name.component.ts | 4 +- .../table-cell-endpoint-status.component.html | 6 +- .../table-cell-endpoint-status.component.ts | 16 +- .../components/list/list.component.html | 26 +- .../shared/components/list/list.component.ts | 137 +- .../components/list/list.component.types.ts | 38 +- .../src/shared/components/list/list.types.ts | 43 +- .../max-list-message.component.html | 13 +- .../simple-list/simple-list.component.spec.ts | 87 - .../list/simple-list/simple-list.component.ts | 66 - .../markdown-preview.component.ts | 3 +- .../no-content-message.component.html | 2 +- .../no-content-message.component.scss | 4 +- .../no-content-message.component.theme.scss | 5 + .../no-content-message.component.ts | 2 +- .../page-header/page-header.component.html | 6 +- .../page-header/page-header.component.scss | 6 +- .../page-header.component.theme.scss | 10 +- .../page-header/page-header.component.ts | 32 +- .../polling-indicator.component.html | 6 +- .../profile-settings.component.html | 77 + .../profile-settings.component.scss | 31 + .../profile-settings.component.spec.ts} | 15 +- .../profile-settings.component.ts | 119 + .../recent-entities.component.html | 5 - .../recent-entities.component.ts | 10 +- .../sidepanel-preview.component.html | 4 + .../sidepanel-preview.component.scss | 12 + .../sidepanel-preview.component.theme.scss | 6 +- .../sidepanel-preview.component.ts | 7 + .../ssh-viewer/ssh-viewer.component.ts | 2 +- .../tile-selector-tile.component.html | 2 +- .../tile-selector-tile.component.scss | 8 + .../tile-selector-tile.component.ts | 2 + .../tile-selector.component.html | 2 +- .../tile-selector/tile-selector.component.ts | 3 +- .../user-avatar.component.theme.scss | 14 +- .../src/shared/services/session.service.ts | 4 +- .../src/shared/services/side-panel.service.ts | 41 +- .../src/shared/services/snackbar.service.ts | 44 +- .../packages/core/src/shared/shared.module.ts | 25 +- .../packages/desktop-extensions/_index.scss | 31 + .../assets/core/types/kubecf-small.png | Bin 0 -> 5632 bytes .../assets/core/types/osb_logo.png | Bin 0 -> 11059 bytes .../desktop-extensions/loader/loading.css | 6 + .../desktop-extensions/loader/loading.html | 2 + .../packages/desktop-extensions/package.json | 20 + .../desktop-extensions/sass/_all-theme.scss | 6 + .../desktop-extensions/sass/colors.scss | 7 + .../desktop-extensions/sass/styles.scss | 48 + .../desktop-login.component.html | 2 + .../desktop-login.component.scss | 1 + .../desktop-login.component.spec.ts | 25 + .../desktop-login/desktop-login.component.ts | 20 + .../src/desktop-routing.module.ts | 34 + .../desktop-extensions/src/desktop.module.ts | 49 + .../src/electron/electron.service.ts | 38 + .../src/electron/electron.ts | 163 + .../choose-type/choose-type.component.html | 27 + .../choose-type/choose-type.component.scss | 60 + .../choose-type/choose-type.component.spec.ts | 25 + .../choose-type/choose-type.component.ts | 29 + .../src/installer/installer.module.ts | 11 + .../src/installer/installer.routing.ts | 26 + .../desktop-extensions/src/public-api.ts | 3 + .../desktop-settings.component.html | 8 + .../desktop-settings.component.scss | 5 + .../desktop-settings.component.spec.ts | 25 + .../desktop-settings.component.ts | 17 + .../src/settings/settings.module.ts | 17 + .../src/settings/settings.routing.ts | 20 + .../packages/devkit/src/build/extensions.ts | 25 +- .../devkit/src/build/index.transform.ts | 12 +- .../packages/devkit/src/lib/packages.ts | 2 +- .../packages/devkit/src/lib/stratos.config.ts | 37 +- src/frontend/packages/git/assets/Git-logo.png | Bin 0 -> 2383 bytes .../packages/git/assets/connect/github.md | 13 + .../packages/git/assets/connect/gitlab.md | 12 + src/frontend/packages/git/karma.conf.js | 8 + src/frontend/packages/git/ng-package.json | 7 + src/frontend/packages/git/package.json | 16 + .../packages/git/sass/_all-theme.scss | 8 + .../packages/git/src/git-package.module.ts | 16 + .../packages/git/src/git-routing.module.ts | 21 + .../packages/git/src/git-testing.module.ts | 25 + src/frontend/packages/git/src/git.module.ts | 6 + src/frontend/packages/git/src/public_api.ts | 14 + .../git-endpoint-details.component.html | 9 + .../git-endpoint-details.component.scss | 22 + .../git-endpoint-details.component.spec.ts | 31 + .../git-endpoint-details.component.ts | 31 + .../git-registration.component.html | 47 + .../git-registration.component.scss | 35 + .../git-registration.component.spec.ts | 50 + .../git-registration.component.ts | 231 + .../github-commit-author.component.html | 4 +- .../github-commit-author.component.scss | 0 .../github-commit-author.component.spec.ts | 6 +- .../github-commit-author.component.ts | 3 +- .../github-commits-data-source.ts | 21 +- ...b-commits-list-config-base.service.spec.ts | 2 +- ...github-commits-list-config-base.service.ts | 7 +- .../table-cell-commit-author.component.html | 0 .../table-cell-commit-author.component.scss | 0 ...table-cell-commit-author.component.spec.ts | 0 .../table-cell-commit-author.component.ts | 0 .../git/src/shared/git-shared.module.ts | 43 + .../core => git/src/shared}/github.helpers.ts | 0 .../shared}/scm/github-pagination.helper.ts | 9 +- .../packages/git/src/shared/scm/github-scm.ts | 131 + .../packages/git/src/shared/scm/gitlab-scm.ts | 218 + .../packages/git/src/shared/scm/scm-base.ts | 84 + .../src/shared}/scm/scm.service.ts | 27 +- .../src/shared}/scm/scm.ts | 24 +- .../git/src/store/git-action-builders.ts | 81 + .../git/src/store/git-entity-factory.ts | 67 + .../git/src/store/git-entity-generator.ts | 226 + .../git/src/store/git-store.module.ts | 14 + .../packages/git/src/store/git.actions.ts | 125 + .../packages/git/src/store/git.effects.ts | 200 + .../git/src/store/git.public-types.ts | 70 + .../packages/git/src/store/git.types.ts | 3 + src/frontend/packages/git/src/test.ts | 36 + src/frontend/packages/git/tsconfig.lib.json | 7 + .../packages/git/tsconfig.lib.prod.json | 6 + src/frontend/packages/git/tsconfig.spec.json | 9 + src/frontend/packages/git/tslint.json | 17 + .../src/helm/helm-entity-generator.ts | 5 +- .../monocular-chart-card.component.ts | 4 +- .../monocular-charts-data-source.ts | 9 +- .../chart-details-info.component.ts | 10 +- .../chart-details-versions.component.spec.ts | 2 +- .../chart-details.component.html | 15 +- .../chart-details/chart-details.component.ts | 44 +- .../src/helm/monocular/monocular.module.ts | 2 +- .../shared/services/charts.service.ts | 8 +- .../stratos-monocular-providers.helpers.ts | 2 +- .../src/helm/store/helm.action-builders.ts | 4 +- .../catalog-tab/catalog-tab.component.spec.ts | 9 +- .../tabs/catalog-tab/catalog-tab.component.ts | 36 +- .../analysis-report-runner.component.ts | 2 +- .../analysis-report-selector.component.ts | 2 +- .../popeye-report-viewer.component.ts | 4 +- .../home/kubernetes-home-card.component.html | 26 + .../home/kubernetes-home-card.component.scss | 10 + .../kubernetes-home-card.component.spec.ts | 32 + .../home/kubernetes-home-card.component.ts | 103 + .../home/kubernetes-home-card.module.ts | 30 + ...be-config-table-import-status.component.ts | 5 +- .../kube-config-table-cert.component.ts | 9 +- .../kube-config.helper.ts | 2 +- .../kubernetes/kubernetes-entity-catalog.ts | 46 - .../kubernetes/kubernetes-entity-factory.ts | 21 +- .../kubernetes/kubernetes-entity-generator.ts | 669 +- .../src/kubernetes/kubernetes-list-service.ts | 26 + ...s-namespace-analysis-report.component.html | 2 +- ...tes-namespace-analysis-report.component.ts | 14 +- .../kubernetes-namespace-pods.component.html | 1 - .../kubernetes-namespace-pods.component.ts | 17 - ...ubernetes-namespace-preview.component.html | 4 + ...ubernetes-namespace-preview.component.scss | 14 + ...rnetes-namespace-preview.component.spec.ts | 28 + .../kubernetes-namespace-preview.component.ts | 50 + ...bernetes-namespace-services.component.html | 1 - ...bernetes-namespace-services.component.scss | 0 ...netes-namespace-services.component.spec.ts | 37 - ...kubernetes-namespace-services.component.ts | 20 - .../kubernetes-namespace.component.html | 6 - .../kubernetes-namespace.component.scss | 0 .../kubernetes-namespace.component.ts | 61 - .../kubernetes-resource-viewer.component.html | 17 +- .../kubernetes-resource-viewer.component.scss | 16 + .../kubernetes-resource-viewer.component.ts | 144 +- .../generic-resource.module.ts | 34 + .../generic-resource.routing.ts | 14 + .../kubernetes-resource-list.component.html | 16 + .../kubernetes-resource-list.component.scss | 36 + ...kubernetes-resource-list.component.spec.ts | 46 + .../kubernetes-resource-list.component.ts | 242 + .../kubernetes-tab-base.component.html | 1 + .../kubernetes-tab-base.component.ts | 37 +- .../src/kubernetes/kubernetes-ui-service.ts | 34 + .../src/kubernetes/kubernetes.module.ts | 29 +- .../src/kubernetes/kubernetes.routing.ts | 65 +- .../src/kubernetes/kubernetes.setup.module.ts | 8 +- .../src/kubernetes/kubernetes.store.module.ts | 4 +- .../kubernetes/kubernetes.testing.module.ts | 4 +- .../analysis-reports-list-source.ts | 2 +- .../analysis-status-cell.component.ts | 2 +- .../kubernetes-namespace-pods-data-source.ts | 2 +- ...etes-namespace-pods-list-config.service.ts | 4 +- ...bernetes-namespace-services-data-source.ts | 4 +- ...-namespace-services-list-config.service.ts | 6 +- .../kubernetes-namespaces-data-source.ts | 2 +- ...bernetes-namespaces-list-config.service.ts | 42 +- .../kubernetes-node-pods-data-source.ts | 2 +- ...ubernetes-node-pods-list-config.service.ts | 4 +- ...ubernetes-node-condition-card.component.ts | 4 +- .../kubernetes-node-condition.component.ts | 4 +- .../kubernetes-node-summary-card.component.ts | 6 +- .../kubernetes-nodes-data-source.ts | 2 +- .../kubernetes-pod-containers.component.ts | 19 +- .../kubernetes-pod-status.component.ts | 5 +- .../kubernetes-pods-data-source.ts | 2 +- .../kubernetes-pods-list-config.service.ts | 48 +- .../kubernetes-service-ports.component.ts | 8 +- .../kubernetes-service-list-config.service.ts | 13 +- .../pod-metrics/pod-metrics.component.ts | 2 +- .../services/kubernetes-endpoint.service.ts | 49 +- .../services/kubernetes-namespace.service.ts | 13 +- .../services/kubernetes-node.service.ts | 2 +- .../services/kubernetes.analysis.service.ts | 22 +- .../kube-resource.action-builder.ts | 49 + .../action-builders/kube.action-builders.ts | 58 +- .../src/kubernetes/store/analysis.actions.ts | 2 +- .../src/kubernetes/store/analysis.effects.ts | 4 +- .../kubernetes/store/kube-resource.actions.ts | 130 + .../src/kubernetes/store/kube.getIds.ts | 35 +- .../src/kubernetes/store/kube.types.ts | 73 +- .../kubernetes/store/kubernetes.actions.ts | 13 +- .../kubernetes/store/kubernetes.effects.ts | 150 +- .../kubernetes/store/kubernetes.reducers.ts | 26 + .../kubernetes-pods-tab.component.html | 1 - .../kubernetes-pods-tab.component.scss | 0 .../kubernetes-pods-tab.component.spec.ts | 30 - .../kubernetes-pods-tab.component.ts | 15 - .../kubernetes-summary.component.ts | 2 +- .../chart-values-editor.component.html | 21 +- .../chart-values-editor.component.ts | 4 +- .../chart-values-editor/diffvalues.ts | 26 +- .../json-schema-generator.ts | 204 +- .../workloads/chart-values-editor/merge.ts | 6 +- .../create-release.component.ts | 2 +- .../helm-release-card.component.ts | 5 +- .../helm-release-pods-list-config.service.ts | 29 - .../helm-release-pods-list-source.ts | 2 +- ...lm-release-services-list-config.service.ts | 28 - .../kube-namespaces-filter-config.service.ts | 2 +- .../helm-release-socket-service.ts | 81 +- .../helm-release-tab-base.component.ts | 27 +- .../workloads/release/icon-helper.ts | 2 +- .../tabs/helm-release-helper.service.ts | 9 +- .../helm-release-pods-tab.component.html | 4 - .../helm-release-pods-tab.component.scss | 3 - .../helm-release-pods-tab.component.spec.ts | 42 - .../helm-release-pods-tab.component.ts | 15 - .../helm-release-resource-graph.component.ts | 12 +- .../helm-release-services-tab.component.html | 4 - .../helm-release-services-tab.component.scss | 3 - ...elm-release-services-tab.component.spec.ts | 43 - .../helm-release-services-tab.component.ts | 15 - .../helm-release-summary-tab.component.ts | 2 +- .../workload-live-reload.component.ts | 2 +- .../store/workloads-entity-factory.ts | 2 +- .../workloads/store/workloads.actions.ts | 71 +- .../kubernetes/workloads/workload.types.ts | 24 +- .../kubernetes/workloads/workloads.module.ts | 6 +- .../kubernetes/workloads/workloads.routing.ts | 11 +- .../workloads/workloads.testing.module.ts | 4 +- .../packages/kubernetes/src/public-api.ts | 2 +- .../store/src/actions/apiKey.actions.ts | 14 +- .../store/src/actions/dashboard-actions.ts | 22 +- .../store/src/actions/endpoint.actions.ts | 18 +- .../store/src/actions/list.actions.ts | 10 +- .../store/src/actions/pagination.actions.ts | 25 +- .../store/src/actions/permissions.actions.ts | 2 +- .../store/src/actions/user-profile.actions.ts | 8 +- .../packages/store/src/apiKey.types.ts | 2 +- src/frontend/packages/store/src/app-state.ts | 2 +- .../store/src/effects/apiKey.effects.ts | 12 +- .../store/src/effects/auth.effects.ts | 23 +- .../store/src/effects/permissions.effect.ts | 4 +- .../src/effects/user-favorites-effect.ts | 14 +- .../entity-catalog-entity-store-helpers.ts | 8 +- .../entity-catalog-entity.ts | 21 +- .../entity-catalog-entity/type.helpers.ts | 12 +- .../src/entity-catalog/entity-catalog.spec.ts | 1 - .../entity-catalog/entity-catalog.types.ts | 36 +- .../map-multi-endpoint.pipes.ts | 4 +- .../entity-request-pipeline.types.ts | 2 +- .../packages/store/src/extension-types.ts | 66 +- .../store/src/favorite-config-mapper.ts | 172 - .../src/helpers/local-storage-service.ts | 254 + .../store/src/helpers/store-helpers.ts | 12 - .../src/helpers/stratos-entity-factory.ts | 4 +- src/frontend/packages/store/src/operators.ts | 39 + src/frontend/packages/store/src/public-api.ts | 3 + .../packages/store/src/reducers.module.ts | 40 +- .../current-user-roles.reducer.ts | 2 +- .../recently-visited.reducer.helpers.ts | 2 +- .../user-favorites-groups.reducer.spec.ts | 40 +- .../user-favorites-groups.reducer.ts | 29 +- .../store/src/reducers/dashboard-reducer.ts | 48 +- .../store/src/reducers/list.reducer.ts | 9 +- .../pagination-reducer-reset-pagination.ts | 11 +- .../pagination-reducer-reset-sort-filter.ts | 34 + .../pagination-reducer-set-params.ts | 4 +- .../pagination-reducer.helper.ts | 8 +- .../pagination-reducer.types.ts | 2 +- .../pagination.reducer.spec.ts | 4 +- .../pagination-reducer/pagination.reducer.ts | 79 +- .../src/selectors/dashboard.selectors.ts | 5 +- .../selectors/favorite-groups.selectors.ts | 6 +- .../store/src/stratos-action-builders.ts | 26 +- .../store/src/stratos-entity-catalog.ts | 10 +- .../store/src/stratos-entity-generator.ts | 28 +- .../packages/store/src/types/auth.types.ts | 2 + .../src/types/current-user-roles.types.ts | 4 +- .../store/src/types/dashboard.types.ts | 27 + .../store/src/types/endpoint.types.ts | 1 + .../store/src/types/favorite-groups.types.ts | 8 +- .../store/src/types/pagination.types.ts | 6 +- .../store/src/types/recently-visited.types.ts | 1 - .../packages/store/src/types/theme.types.ts | 2 +- .../src/types/user-favorite-manager.types.ts | 27 - .../store/src/types/user-favorites.types.ts | 112 +- .../store/src/user-favorite-helpers.ts | 38 +- .../store/src/user-favorite-manager.ts | 163 +- .../store/testing/src/store-test-helper.ts | 17 +- .../suse-extensions/src/public-api.ts | 2 +- src/frontend/packages/theme/_helper.scss | 31 +- src/jetstream/auth.go | 5 + src/jetstream/auth_test.go | 10 +- src/jetstream/authcnsi.go | 5 +- src/jetstream/authlocal.go | 10 +- src/jetstream/authnone.go | 155 + src/jetstream/authuaa.go | 37 +- src/jetstream/cnsi.go | 36 +- src/jetstream/config.dev | 7 +- src/jetstream/config.example | 11 +- src/jetstream/console-database.db2 | Bin 0 -> 225279 bytes src/jetstream/factory/factory.go | 31 + src/jetstream/go.mod | 10 +- src/jetstream/go.sum | 33 + src/jetstream/http_basic_requests.go | 30 + src/jetstream/info.go | 11 +- src/jetstream/load_plugins.go | 4 + src/jetstream/main.go | 89 +- src/jetstream/mock_server_test.go | 14 +- src/jetstream/noauth_requests.go | 26 + src/jetstream/oauth_requests.go | 15 +- src/jetstream/passthrough.go | 80 +- src/jetstream/plugins.yaml | 10 + .../plugins/backup/backup_restore.go | 8 +- src/jetstream/plugins/backup/main.go | 8 +- src/jetstream/plugins/cfapppush/deploy.go | 64 +- src/jetstream/plugins/cfapppush/types.go | 12 +- src/jetstream/plugins/desktop/cloudfoundry.go | 176 + src/jetstream/plugins/desktop/endpoints.go | 133 + .../plugins/desktop/kubernetes/auth.go | 93 + .../plugins/desktop/kubernetes/endpoints.go | 115 + .../plugins/desktop/kubernetes/kubeconfig.go | 184 + .../plugins/desktop/kubernetes/main.go | 58 + .../plugins/desktop/kubernetes/tokens.go | 76 + src/jetstream/plugins/desktop/main.go | 92 + src/jetstream/plugins/desktop/tokens.go | 99 + .../plugins/metrics/cloud_foundry.go | 6 +- src/jetstream/plugins/metrics/main.go | 42 +- src/jetstream/plugins/userinfo/main.go | 3 +- src/jetstream/plugins/userinfo/noauth_user.go | 57 + src/jetstream/plugins/yamlgenerated/main.go | 279 + src/jetstream/portal_proxy.go | 1 + src/jetstream/repository/cnsis/cnsis.go | 22 - src/jetstream/repository/cnsis/pgsql_cnsis.go | 2 +- src/jetstream/repository/interfaces/auth.go | 7 + src/jetstream/repository/interfaces/cnsis.go | 18 + .../repository/interfaces/config/config.go | 17 +- .../repository/interfaces/portal_proxy.go | 5 + src/jetstream/repository/interfaces/store.go | 7 + .../repository/interfaces/structs.go | 60 +- src/jetstream/repository/interfaces/tokens.go | 24 + .../repository/mock_interfaces/mock_auth.go | 24 + .../repository/tokens/pgsql_tokens.go | 5 +- .../repository/tokens/pgsql_tokens_test.go | 2 +- src/jetstream/repository/tokens/tokens.go | 29 - src/jetstream/session.go | 9 + src/jetstream/setup_console.go | 6 +- src/test-e2e/apikeys/apikeys-e2e.spec.ts | 3 +- .../application-autoscaler-e2e.spec.ts | 14 +- .../application-deploy-e2e.spec.ts | 19 +- .../application/application-deploy-helper.ts | 8 +- .../po/base-create-application-stepper.po.ts | 2 +- .../application/po/card-app-deploy-info.po.ts | 4 +- .../applications/application-wall-e2e.spec.ts | 2 +- .../cf-level/cf-top-level-page.po.ts | 1 + .../org-level/cf-org-delete-e2e.spec.ts | 3 + .../org-level/org-spaces-e2e.spec.ts | 8 +- .../space-level/cf-space-delete-e2e.spec.ts | 1 + .../space-level/space-routes-e2e.spec.ts | 8 +- src/test-e2e/endpoints/endpoints.po.ts | 8 +- .../delete-service-instance-e2e.spec.ts | 2 +- .../delete-ups-service-instance-e2e.spec.ts | 1 + .../metrics/metrics-registration-e2e.spec.ts | 8 +- src/test-e2e/po/list.po.ts | 24 +- src/test-e2e/po/stepper.po.ts | 2 +- src/tsconfig.json | 2 + src/tsconfig.lib.json | 2 +- src/tsconfig.spec.json | 2 +- tslint.json | 60 +- website/add-version.sh | 2 +- website/docs/advanced/sso.md | 79 +- website/internal-versions.json | 3 +- 801 files changed, 24515 insertions(+), 9951 deletions(-) create mode 100644 electron/README.md create mode 100644 electron/VolumeIcon.icns create mode 100644 electron/about.html create mode 100644 electron/background.png create mode 100755 electron/build.sh create mode 100644 electron/config.properties create mode 100644 electron/electron-store.js create mode 100644 electron/freeport.js create mode 100644 electron/icon.icns create mode 100644 electron/icon.png create mode 100644 electron/index.js create mode 100644 electron/logo.png create mode 100644 electron/menu.js create mode 100644 electron/package-lock.json create mode 100644 electron/package.json create mode 100755 electron/package.sh create mode 100755 electron/prep-backend.sh create mode 100755 electron/run.sh create mode 100644 electron/stratos.yaml delete mode 100644 src/frontend/packages/cf-autoscaler/src/store/autoscaler.store.module.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/actions/github.actions.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.html rename src/frontend/packages/cloud-foundry/src/{shared/components/cards => features/home}/card-cf-recent-apps/card-cf-recent-apps.component.scss (70%) rename src/frontend/packages/cloud-foundry/src/{shared/components/cards => features/home}/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts (64%) create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.ts create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.html create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss rename src/frontend/packages/cloud-foundry/src/{shared/components/cards => features/home}/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts (69%) rename src/frontend/packages/cloud-foundry/src/{shared/components/cards => features/home}/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts (65%) create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.html create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.scss create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.spec.ts create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.ts create mode 100644 src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.module.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.html delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.html delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-data-source.service.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.spec.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts rename src/frontend/packages/cloud-foundry/src/shared/services/{current-user-permissions.service.spec.ts => current-user-permissions-and-cfchecker.service.spec.ts} (98%) delete mode 100644 src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/store/types/git.types.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/store/types/github.types.ts create mode 100644 src/frontend/packages/core/src/environments/environment.desktop.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/auth-forms/token-endpoint/token-endpoint.component.html create mode 100644 src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/auth-forms/token-endpoint/token-endpoint.component.scss create mode 100644 src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/auth-forms/token-endpoint/token-endpoint.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/connect-endpoint-dialog/auth-forms/token-endpoint/token-endpoint.component.ts create mode 100644 src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/base-endpoint-tile-manager.ts create mode 100644 src/frontend/packages/core/src/features/home/home.types.ts create mode 100644 src/frontend/packages/core/src/features/home/home/default-endpoint-home-component/default-endpoint-home-component.component.html create mode 100644 src/frontend/packages/core/src/features/home/home/default-endpoint-home-component/default-endpoint-home-component.component.scss create mode 100644 src/frontend/packages/core/src/features/home/home/default-endpoint-home-component/default-endpoint-home-component.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/home/home/default-endpoint-home-component/default-endpoint-home-component.component.ts create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-meta-card/favorites-meta-card.component.html create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-meta-card/favorites-meta-card.component.scss rename src/frontend/packages/core/src/{shared/components => features/home/home}/favorites-meta-card/favorites-meta-card.component.spec.ts (89%) rename src/frontend/packages/core/src/{shared/components => features/home/home}/favorites-meta-card/favorites-meta-card.component.theme.scss (100%) create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-meta-card/favorites-meta-card.component.ts create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-side-panel/favorites-side-panel.component.html create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-side-panel/favorites-side-panel.component.scss create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-side-panel/favorites-side-panel.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/home/home/favorites-side-panel/favorites-side-panel.component.ts create mode 100644 src/frontend/packages/core/src/features/home/home/home-page-endpoint-card/home-page-endpoint-card.component.html create mode 100644 src/frontend/packages/core/src/features/home/home/home-page-endpoint-card/home-page-endpoint-card.component.scss create mode 100644 src/frontend/packages/core/src/features/home/home/home-page-endpoint-card/home-page-endpoint-card.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/home/home/home-page-endpoint-card/home-page-endpoint-card.component.theme.scss create mode 100644 src/frontend/packages/core/src/features/home/home/home-page-endpoint-card/home-page-endpoint-card.component.ts create mode 100644 src/frontend/packages/core/src/features/home/home/home-shortcuts/home-shortcuts.component.html create mode 100644 src/frontend/packages/core/src/features/home/home/home-shortcuts/home-shortcuts.component.scss create mode 100644 src/frontend/packages/core/src/features/home/home/home-shortcuts/home-shortcuts.component.spec.ts create mode 100644 src/frontend/packages/core/src/features/home/home/home-shortcuts/home-shortcuts.component.ts delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-entity-list/favorites-entity-list.component.html delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-entity-list/favorites-entity-list.component.scss delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-entity-list/favorites-entity-list.component.spec.ts delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-entity-list/favorites-entity-list.component.ts delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.html delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.scss delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.theme.scss delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.ts delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.html delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.scss delete mode 100644 src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/entity-list-view/entity-list-view.component.html rename src/frontend/packages/core/src/shared/components/list/{simple-list/simple-list.component.scss => list-generics/entity-list-view/entity-list-view.component.scss} (100%) create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/entity-list-view/entity-list-view.component.spec.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/entity-list-view/entity-list-view.component.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/helpers/action-or-config-helpers.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/helpers/entity-catalogue-list-config.ts rename src/frontend/packages/core/src/shared/components/list/{simple-list => list-generics/helpers}/list-host.directive.ts (100%) create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-config-provider.types.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-providers/action-list-config-provider.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-providers/action-or-entity-config-list-config-provider.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-providers/entity-config-list-config-provider.ts rename src/frontend/packages/core/src/shared/components/list/{simple-list/simple-list.component.html => list-generics/list-view/list-view.component.html} (100%) rename src/frontend/packages/{kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-pods/kubernetes-namespace-pods.component.scss => core/src/shared/components/list/list-generics/list-view/list-view.component.scss} (100%) create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.spec.ts create mode 100644 src/frontend/packages/core/src/shared/components/list/list-generics/list-view/list-view.component.ts delete mode 100644 src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts delete mode 100644 src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts create mode 100644 src/frontend/packages/core/src/shared/components/profile-settings/profile-settings.component.html create mode 100644 src/frontend/packages/core/src/shared/components/profile-settings/profile-settings.component.scss rename src/frontend/packages/core/src/shared/components/{favorites-global-list/favorites-global-list.component.spec.ts => profile-settings/profile-settings.component.spec.ts} (51%) create mode 100644 src/frontend/packages/core/src/shared/components/profile-settings/profile-settings.component.ts create mode 100644 src/frontend/packages/desktop-extensions/_index.scss create mode 100644 src/frontend/packages/desktop-extensions/assets/core/types/kubecf-small.png create mode 100644 src/frontend/packages/desktop-extensions/assets/core/types/osb_logo.png create mode 100644 src/frontend/packages/desktop-extensions/loader/loading.css create mode 100644 src/frontend/packages/desktop-extensions/loader/loading.html create mode 100644 src/frontend/packages/desktop-extensions/package.json create mode 100644 src/frontend/packages/desktop-extensions/sass/_all-theme.scss create mode 100644 src/frontend/packages/desktop-extensions/sass/colors.scss create mode 100644 src/frontend/packages/desktop-extensions/sass/styles.scss create mode 100644 src/frontend/packages/desktop-extensions/src/desktop-login/desktop-login.component.html create mode 100644 src/frontend/packages/desktop-extensions/src/desktop-login/desktop-login.component.scss create mode 100644 src/frontend/packages/desktop-extensions/src/desktop-login/desktop-login.component.spec.ts create mode 100644 src/frontend/packages/desktop-extensions/src/desktop-login/desktop-login.component.ts create mode 100644 src/frontend/packages/desktop-extensions/src/desktop-routing.module.ts create mode 100644 src/frontend/packages/desktop-extensions/src/desktop.module.ts create mode 100644 src/frontend/packages/desktop-extensions/src/electron/electron.service.ts create mode 100644 src/frontend/packages/desktop-extensions/src/electron/electron.ts create mode 100644 src/frontend/packages/desktop-extensions/src/installer/choose-type/choose-type.component.html create mode 100644 src/frontend/packages/desktop-extensions/src/installer/choose-type/choose-type.component.scss create mode 100644 src/frontend/packages/desktop-extensions/src/installer/choose-type/choose-type.component.spec.ts create mode 100644 src/frontend/packages/desktop-extensions/src/installer/choose-type/choose-type.component.ts create mode 100644 src/frontend/packages/desktop-extensions/src/installer/installer.module.ts create mode 100644 src/frontend/packages/desktop-extensions/src/installer/installer.routing.ts create mode 100644 src/frontend/packages/desktop-extensions/src/public-api.ts create mode 100644 src/frontend/packages/desktop-extensions/src/settings/desktop-settings/desktop-settings.component.html create mode 100644 src/frontend/packages/desktop-extensions/src/settings/desktop-settings/desktop-settings.component.scss create mode 100644 src/frontend/packages/desktop-extensions/src/settings/desktop-settings/desktop-settings.component.spec.ts create mode 100644 src/frontend/packages/desktop-extensions/src/settings/desktop-settings/desktop-settings.component.ts create mode 100644 src/frontend/packages/desktop-extensions/src/settings/settings.module.ts create mode 100644 src/frontend/packages/desktop-extensions/src/settings/settings.routing.ts create mode 100644 src/frontend/packages/git/assets/Git-logo.png create mode 100644 src/frontend/packages/git/assets/connect/github.md create mode 100644 src/frontend/packages/git/assets/connect/gitlab.md create mode 100644 src/frontend/packages/git/karma.conf.js create mode 100644 src/frontend/packages/git/ng-package.json create mode 100644 src/frontend/packages/git/package.json create mode 100644 src/frontend/packages/git/sass/_all-theme.scss create mode 100644 src/frontend/packages/git/src/git-package.module.ts create mode 100644 src/frontend/packages/git/src/git-routing.module.ts create mode 100644 src/frontend/packages/git/src/git-testing.module.ts create mode 100644 src/frontend/packages/git/src/git.module.ts create mode 100644 src/frontend/packages/git/src/public_api.ts create mode 100644 src/frontend/packages/git/src/shared/components/git-endpoint-details/git-endpoint-details.component.html create mode 100644 src/frontend/packages/git/src/shared/components/git-endpoint-details/git-endpoint-details.component.scss create mode 100644 src/frontend/packages/git/src/shared/components/git-endpoint-details/git-endpoint-details.component.spec.ts create mode 100644 src/frontend/packages/git/src/shared/components/git-endpoint-details/git-endpoint-details.component.ts create mode 100644 src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.html create mode 100644 src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.scss create mode 100644 src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.spec.ts create mode 100644 src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.ts rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/github-commit-author/github-commit-author.component.html (73%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/github-commit-author/github-commit-author.component.scss (100%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/github-commit-author/github-commit-author.component.spec.ts (94%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/github-commit-author/github-commit-author.component.ts (84%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts (58%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts (91%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts (92%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.html (100%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.scss (100%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts (100%) rename src/frontend/packages/{cloud-foundry => git}/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts (100%) create mode 100644 src/frontend/packages/git/src/shared/git-shared.module.ts rename src/frontend/packages/{core/src/core => git/src/shared}/github.helpers.ts (100%) rename src/frontend/packages/{cloud-foundry/src/shared/data-services => git/src/shared}/scm/github-pagination.helper.ts (96%) create mode 100644 src/frontend/packages/git/src/shared/scm/github-scm.ts create mode 100644 src/frontend/packages/git/src/shared/scm/gitlab-scm.ts create mode 100644 src/frontend/packages/git/src/shared/scm/scm-base.ts rename src/frontend/packages/{cloud-foundry/src/shared/data-services => git/src/shared}/scm/scm.service.ts (51%) rename src/frontend/packages/{cloud-foundry/src/shared/data-services => git/src/shared}/scm/scm.ts (56%) create mode 100644 src/frontend/packages/git/src/store/git-action-builders.ts create mode 100644 src/frontend/packages/git/src/store/git-entity-factory.ts create mode 100644 src/frontend/packages/git/src/store/git-entity-generator.ts create mode 100644 src/frontend/packages/git/src/store/git-store.module.ts create mode 100644 src/frontend/packages/git/src/store/git.actions.ts create mode 100644 src/frontend/packages/git/src/store/git.effects.ts create mode 100644 src/frontend/packages/git/src/store/git.public-types.ts create mode 100644 src/frontend/packages/git/src/store/git.types.ts create mode 100644 src/frontend/packages/git/src/test.ts create mode 100644 src/frontend/packages/git/tsconfig.lib.json create mode 100644 src/frontend/packages/git/tsconfig.lib.prod.json create mode 100644 src/frontend/packages/git/tsconfig.spec.json create mode 100644 src/frontend/packages/git/tslint.json create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.html create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.scss create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.spec.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.component.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/home/kubernetes-home-card.module.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-entity-catalog.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-list-service.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-pods/kubernetes-namespace-pods.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-pods/kubernetes-namespace-pods.component.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-preview/kubernetes-namespace-preview.component.html create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-preview/kubernetes-namespace-preview.component.scss create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-preview/kubernetes-namespace-preview.component.spec.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-preview/kubernetes-namespace-preview.component.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-services/kubernetes-namespace-services.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-services/kubernetes-namespace-services.component.scss delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-services/kubernetes-namespace-services.component.spec.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace-services/kubernetes-namespace-services.component.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.scss delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-namespace/kubernetes-namespace.component.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.module.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/generic-resource.routing.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.html create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.scss create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.spec.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-resource/kubernetes-resource-list/kubernetes-resource-list.component.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/kubernetes-ui-service.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/store/action-builders/kube-resource.action-builder.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/store/kube-resource.actions.ts create mode 100644 src/frontend/packages/kubernetes/src/kubernetes/store/kubernetes.reducers.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.scss delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.spec.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/tabs/kubernetes-pods-tab/kubernetes-pods-tab.component.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-pods-list-config.service.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/list-types/helm-release-services-list-config.service.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-pods/helm-release-pods-tab.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-pods/helm-release-pods-tab.component.scss delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-pods/helm-release-pods-tab.component.spec.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-pods/helm-release-pods-tab.component.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-services/helm-release-services-tab.component.html delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-services/helm-release-services-tab.component.scss delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-services/helm-release-services-tab.component.spec.ts delete mode 100644 src/frontend/packages/kubernetes/src/kubernetes/workloads/release/tabs/helm-release-services/helm-release-services-tab.component.ts delete mode 100644 src/frontend/packages/store/src/favorite-config-mapper.ts create mode 100644 src/frontend/packages/store/src/helpers/local-storage-service.ts create mode 100644 src/frontend/packages/store/src/operators.ts create mode 100644 src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-sort-filter.ts create mode 100644 src/frontend/packages/store/src/types/dashboard.types.ts delete mode 100644 src/frontend/packages/store/src/types/user-favorite-manager.types.ts create mode 100644 src/jetstream/authnone.go create mode 100644 src/jetstream/console-database.db2 create mode 100644 src/jetstream/factory/factory.go create mode 100644 src/jetstream/noauth_requests.go create mode 100644 src/jetstream/plugins.yaml create mode 100644 src/jetstream/plugins/desktop/cloudfoundry.go create mode 100644 src/jetstream/plugins/desktop/endpoints.go create mode 100644 src/jetstream/plugins/desktop/kubernetes/auth.go create mode 100644 src/jetstream/plugins/desktop/kubernetes/endpoints.go create mode 100644 src/jetstream/plugins/desktop/kubernetes/kubeconfig.go create mode 100644 src/jetstream/plugins/desktop/kubernetes/main.go create mode 100644 src/jetstream/plugins/desktop/kubernetes/tokens.go create mode 100644 src/jetstream/plugins/desktop/main.go create mode 100644 src/jetstream/plugins/desktop/tokens.go create mode 100644 src/jetstream/plugins/userinfo/noauth_user.go create mode 100644 src/jetstream/plugins/yamlgenerated/main.go delete mode 100644 src/jetstream/repository/cnsis/cnsis.go create mode 100644 src/jetstream/repository/interfaces/cnsis.go create mode 100644 src/jetstream/repository/interfaces/store.go create mode 100644 src/jetstream/repository/interfaces/tokens.go delete mode 100644 src/jetstream/repository/tokens/tokens.go diff --git a/.github/workflows/documentation-versioning.yml b/.github/workflows/documentation-versioning.yml index c7ba603a5c..d23364ceda 100644 --- a/.github/workflows/documentation-versioning.yml +++ b/.github/workflows/documentation-versioning.yml @@ -36,7 +36,7 @@ jobs: labels: | ready for review draft: false - base: ${{env.GITHUB_REF}} + base: ${GITHUB_REF##*/} - name: Check output run: | echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" diff --git a/.gitignore b/.gitignore index 315651887b..8305cd8f77 100644 --- a/.gitignore +++ b/.gitignore @@ -91,12 +91,13 @@ build/dev_config.json e2e-reports/ .stratos-git-metadata.json src/jetstream/jetstream -src/jetstream/console-database.db +console-database.db src/jetstream/config.properties src/jetstream/db/dbconf.yml src/jetstream/plugins/monocular/chart-repo/chartrepo src/jetstream/plugins/analysis/container/analyzers src/jetstream/.helm-cache +src/jetstream/coverage.txt # Automatically generated OpenAPI docs src/jetstream/docs/ @@ -139,3 +140,11 @@ website/versions.json website/versions-repo /scan_tmp + +# Desktop app using Electron +/electron/dist +/electron/node_modules +/electron/out +/electron/dev-ssl +/electron/jetstream +/electron/version \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index ad7506ff43..d63af68e85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Change Log +## 4.4.0 + +[Full Changelog](https://github.com/cloudfoundry/stratos/compare/4.3.0...4.4.0) + +This release includes a number of improvements and fixes, including updates to visible Kubernetes resource types, deploying applications from private Github/Gitlab repositories and a greatly improved home page. + +**Improvements:** + +- Show more kube resource types for a cluster [\#4823](https://github.com/cloudfoundry/stratos/issues/4823) +- Add additional kube resources to Workload page [\#4831](https://github.com/cloudfoundry/stratos/issues/4831) +- Deploy Applications from Enterprise GitHub and GitLab [\#4828](https://github.com/cloudfoundry/stratos/issues/4828) +- Improve initial home page to show more meaningful data [\#4774](https://github.com/cloudfoundry/stratos/issues/4774) +- Persist list settings over browser refresh & add reset button [\#4814](https://github.com/cloudfoundry/stratos/issues/4814) +- Application logstreams incorrectly render unicode characters in the log. [\#4807](https://github.com/cloudfoundry/stratos/issues/4807) +- No option to set an SSOWhitelist with helm deployments [\#4785](https://github.com/cloudfoundry/stratos/issues/4785) +- Endpoint Registration: Advanced Client ID and Secret fields can be confusing [\#4767](https://github.com/cloudfoundry/stratos/issues/4767) +- Clicking on a helm repo endpoint should automatically set it as a filter in chart list [\#4760](https://github.com/cloudfoundry/stratos/issues/4760) +- Upgrade to Angular 10 [\#4725](https://github.com/cloudfoundry/stratos/issues/4725) +- Add ability to favourite Kubernetes Namespaces [\#4651](https://github.com/cloudfoundry/stratos/issues/4651) + +**Fixes:** + +- Can't connect Stratos to a non-Stratos-Metrics Prometheus [\#4804](https://github.com/cloudfoundry/stratos/issues/4804) +- UAA Setup UI does not accept client secret with # char [\#4789](https://github.com/cloudfoundry/stratos/issues/4789) +- Password show/hide icon takes tab focus [\#4768](https://github.com/cloudfoundry/stratos/issues/4768) + + ## 4.3.0 [Full Changelog](https://github.com/SUSE/stratos/compare/4.2.1...4.3.0) @@ -220,7 +247,7 @@ This release contains a number of fixes and improvements: **Improvements:** -- Apply SSO whitelist to additional places [\#4318](https://github.com/cloudfoundry/stratos/issues/4318) +- Apply SSO allow-list to additional places [\#4318](https://github.com/cloudfoundry/stratos/issues/4318) **Fixes:** diff --git a/angular.json b/angular.json index 31c5a47d56..6e13303c18 100644 --- a/angular.json +++ b/angular.json @@ -11,6 +11,18 @@ "build": { "builder": "@angular-builders/custom-webpack:browser", "options": { + "allowedCommonJsDependencies": [ + "moment-timezone", + "js-yaml", + "webcola", + "dagre", + "lodash/isEqual", + "ajv", + "lodash/filter", + "lodash/map", + "lodash/uniqueId", + "lodash/cloneDeep" + ], "customWebpackConfig": { "path": "./dist-devkit/build/main.js" }, @@ -61,7 +73,23 @@ "replace": "src/frontend/packages/core/src/environments/environment.ts", "with": "src/frontend/packages/core/src/environments/environment.prod.ts" }] + }, + "desktop": { + "optimization": false, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": false, + "fileReplacements": [{ + "replace": "src/frontend/packages/core/src/environments/environment.ts", + "with": "src/frontend/packages/core/src/environments/environment.desktop.ts" + }] } + } }, "serve": { @@ -77,6 +105,9 @@ "configurations": { "production": { "browserTarget": "stratos:build:production" + }, + "desktop": { + "browserTarget": "stratos:build:desktop" } } }, @@ -404,6 +435,34 @@ } } } + }, + "git": { + "root": "src/frontend/packages/git", + "sourceRoot": "src/frontend/packages/git/src", + "projectType": "library", + "prefix": "lib", + "architect": { + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/frontend/packages/git/src/test.ts", + "tsConfig": "src/frontend/packages/git/tsconfig.spec.json", + "karmaConfig": "src/frontend/packages/git/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.json" + ], + "tslintConfig": "src/frontend/packages/git/tslint.json", + "files": [ + "src/frontend/packages/git/src/**/*.ts" + ] + } + } + } } }, diff --git a/deploy/Dockerfile.all-in-one b/deploy/Dockerfile.all-in-one index f577039539..6cf57b4d5c 100644 --- a/deploy/Dockerfile.all-in-one +++ b/deploy/Dockerfile.all-in-one @@ -23,15 +23,24 @@ RUN CERTS_PATH=/home/stratos/dev-certs ./generate_cert.sh FROM splatform/stratos-bk-base:leap15_2 ARG CANARY_BUILD -COPY --from=jetstream-builder /home/stratos/deploy/db /src/deploy/db -COPY --from=jetstream-builder /home/stratos/dev-certs /srv/dev-certs -COPY --from=jetstream-builder /home/stratos/ui /srv/ui -COPY --from=jetstream-builder /home/stratos/jetstream /srv/jetstream +# Add a jetstream user so we don't run as root +RUN useradd -M -U -u 2000 jetstream +RUN usermod -aG users jetstream + +# Ensure that the /srv folder is in the users group so that the jetstream user can write to it +RUN mkdir -p /srv && chgrp users /srv && chmod 775 /srv + +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/dev-certs /srv/dev-certs +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/ui /srv/ui +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/jetstream /srv/jetstream RUN chmod +x /srv/jetstream -COPY --from=jetstream-builder /home/stratos/config.properties /srv/config.properties +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/config.properties /srv/config.properties # User Invite templates -COPY --from=jetstream-builder /home/stratos/src/jetstream/templates /srv/templates +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/src/jetstream/templates /srv/templates + +# Plugins.yaml configuration +COPY --chown=jetstream:users --from=jetstream-builder /home/stratos/src/jetstream/plugins.yaml /srv/plugins.yaml # Enable persistence features if canary build flag is set RUN if [ "x$CANARY_BUILD" != "x" ] ; then printf "\nFORCE_ENABLE_PERSISTENCE_FEATURES=true\n" >> /srv/config.properties ; fi @@ -41,13 +50,6 @@ RUN if [ "x$CANARY_BUILD" != "x" ] ; then printf "\nENABLE_TECH_PREVIEW=true\n" EXPOSE 5443 -# Add a jetstream user so we don't run as root -RUN useradd -M -U -u 2000 jetstream -RUN usermod -aG users jetstream - -# Ensure that the /srv folder is in the users group so that the jetstream user can write to it -RUN chgrp users /srv && chmod 775 /srv - USER jetstream ENTRYPOINT ["./jetstream"] \ No newline at end of file diff --git a/deploy/Dockerfile.bk b/deploy/Dockerfile.bk index 9db5d7e05a..1a335b19f0 100644 --- a/deploy/Dockerfile.bk +++ b/deploy/Dockerfile.bk @@ -9,6 +9,7 @@ RUN npm run build-backend FROM splatform/stratos-bk-base:leap15_2 as common-build COPY --from=builder /home/stratos/src/jetstream/jetstream /srv/ +COPY --from=builder /home/stratos/src/jetstream/plugins.yaml /srv/ RUN chmod +x /srv/jetstream # use --target=prod-build to build a backend image for Kubernetes diff --git a/deploy/ci/travis/e2e-mc-helper.sh b/deploy/ci/travis/e2e-mc-helper.sh index 5201e0a46f..a3ab8dfa94 100644 --- a/deploy/ci/travis/e2e-mc-helper.sh +++ b/deploy/ci/travis/e2e-mc-helper.sh @@ -11,8 +11,6 @@ else chmod +x mc cp mc ~/bin - mc -install -y >/dev/null 2>&1 - echo "Configuring mc client" mc config host add s3 ${AWS_ENDPOINT} ${AWS_ACCESS_KEY_ID} ${AWS_SECRET_ACCESS_KEY} --insecure diff --git a/deploy/ci/travis/run-e2e-tests.sh b/deploy/ci/travis/run-e2e-tests.sh index 78ba65ac61..6fa4571edf 100755 --- a/deploy/ci/travis/run-e2e-tests.sh +++ b/deploy/ci/travis/run-e2e-tests.sh @@ -65,7 +65,9 @@ export STRATOS_E2E_BASE_URL="https://127.0.0.1:5443" E2E_TARGET="e2e -- --no-webdriver-update --dev-server-target= --base-url=https://127.0.0.1:5443 --suite=${SUITE}" # Set Stratos debug if running a PR with the appropriate label +set +e source "${DIRPATH}/deploy/ci/travis/check-e2e-pr.sh" +set -e # Capture video if configured if [ "$CAPTURE_VIDEO" == "video" ]; then diff --git a/deploy/cloud-foundry/build.sh b/deploy/cloud-foundry/build.sh index 3d89979b33..8e047f3016 100755 --- a/deploy/cloud-foundry/build.sh +++ b/deploy/cloud-foundry/build.sh @@ -69,6 +69,9 @@ cp src/jetstream/jetstream . # Copy the user invite templates cp -R src/jetstream/templates ./templates +# Copy plugins.yaml +cp src/jetstream/plugins.yaml . + # Back-end serves static resources from ui folder not dist mv dist ui diff --git a/deploy/kubernetes/console/README.md b/deploy/kubernetes/console/README.md index 34f7068858..e2ed7fe44e 100644 --- a/deploy/kubernetes/console/README.md +++ b/deploy/kubernetes/console/README.md @@ -58,6 +58,8 @@ The following table lists the configurable parameters of the Stratos Helm chart |imagePullPolicy|Image pull policy|IfNotPresent| |console.sessionStoreSecret|Secret to use when encrypting session tokens|auto-generated random value| |console.ssoLogin|Whether to enable SSO Login and use the UAA Login UI instead of the built-in one|false| +|console.ssoOptions|Advanced options to customize the SSO experience|| +|console.ssoAllowList|List of permitted redirect URLs for SSO authentication|| |console.backendLogLevel|Log level for backend (info, debug)|info| |console.service.externalIPs|External IPs to add to the console service|[]| |console.service.loadBalancerIP|IP address to assign to the load balancer for the metrics service (if supported)|| @@ -66,9 +68,9 @@ The following table lists the configurable parameters of the Stratos Helm chart |console.service.servicePort|Service port for the console service|443| |console.service.externalName|External name for the console service when service type is ExternalName|| |console.service.nodePort|Node port to use for the console service when service type is NodePort or LoadBalancer|| -|console.ingress.enabled|Enable ingress for the console service|false| -|console.ingress.host|Host for the ingress resource||| -|console.ingress.secretName|Name of an existing secret containing the TLS certificate for ingress||| +|console.service.ingress.enabled|Enable ingress for the console service|false| +|console.service.ingress.host|Host for the ingress resource||| +|console.service.ingress.secretName|Name of an existing secret containing the TLS certificate for ingress||| |console.service.http.enabled|Enabled HTTP access to the console service (as well as HTTPS)|false| |console.service.http.servicePort|Service port for HTTP access to the console service when enabled|80| |console.service.http.nodePort|Node port for HTTP access to the console service (as well as HTTPS)|| @@ -190,6 +192,32 @@ helm install my-console stratos/console --namespace=console --set console.servic ## Using an Ingress Controller +### Bare minimum Stratos deployment with an Ingress + +1. Deploy `ingress-nginx` Ingress controller into your Kubernetes cluster using the [Helm chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx) or [Kubernetes spec files](https://kubernetes.github.io/ingress-nginx/deploy/). +2. Create `values.yaml` with the following Stratos Helm chart configuration values: +``` +console: + service: + ingress: + enabled: true +``` +3. Install Stratos: +``` +helm repo add stratos https://cloudfoundry.github.io/stratos +kubectl create namespace console +helm install my-console stratos/console --namespace=console --values values.yaml +``` +4. Obtain Ingress address by running `kubectl get ingress --namespace=console`, your Stratos installation should be accessible at that address. + +Note that configuration above would result in a deployment with self-signed HTTPS certificates and Stratos service being a default backend for the Ingress. The following steps most likely would be required for a production deployment: + +1. Acquire a static IP address for the Ingress. +2. Assign a domain name to the static IP via a DNS record and set `console.service.ingress.host` value. +3. Create a Kubernetes secret containing valid HTTPS certificates for the domain and set `console.service.ingress.secretName` value. + +### Ingress configuration + If your Kubernetes Cluster supports Ingress, you can expose Stratos through Ingress by supplying the appropriate ingress configuration when installing. This configuration is described below: @@ -202,7 +230,7 @@ This configuration is described below: |console.service.ingress.host|The host name that will be used for the Stratos service.|| |console.service.ingress.secretName|The existing TLS secret that contains the certificate for ingress.|| -You must provide `console.service.ingress.host` when enabling ingress. +If `console.service.ingress.host` isn't provided, Stratos service will be used as the default backend. By default a certificate will be generated for TLS. You can provide your own certificate by creating a secret and specifying this with `console.service.ingress.secretName`. diff --git a/deploy/kubernetes/console/templates/NOTES.txt b/deploy/kubernetes/console/templates/NOTES.txt index a423cd3600..85402894d2 100644 --- a/deploy/kubernetes/console/templates/NOTES.txt +++ b/deploy/kubernetes/console/templates/NOTES.txt @@ -3,9 +3,18 @@ Tech Preview is enabled, extra features will be shown. {{- end}} To access Stratos: -{{- $ingress := .Values.console.ingress | default dict }} +{{- $ingress := .Values.console.service.ingress | default dict }} {{- if $ingress.enabled }} -From outside the cluster, the server URL is: http://{{ .Values.console.ingress.host }} +{{- if .Values.console.service.ingress.host }} +From outside the cluster, the server URL is: https://{{ .Values.console.service.ingress.host }} +{{- else }} +NOTE: It may take a few minutes for the Ingress IP to become available. +You can watch the status of by running 'kubectl get ingress --namespace {{ .Release.Namespace }} -w {{ .Release.Name }}-ingress' + +Get the URL by running these commands in the same shell: + export INGRESS_ADDR=$(kubectl get ingress --namespace {{ .Release.Namespace }} --field-selector 'metadata.name={{ .Release.Name }}-ingress' -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}') + echo https://$INGRESS_ADDR +{{- end }} {{- else }} Get the URL by running these commands in the same shell: {{- if contains "NodePort" .Values.console.service.type }} diff --git a/deploy/kubernetes/console/templates/__helpers.tpl b/deploy/kubernetes/console/templates/__helpers.tpl index dca1d26576..765d379bbd 100644 --- a/deploy/kubernetes/console/templates/__helpers.tpl +++ b/deploy/kubernetes/console/templates/__helpers.tpl @@ -155,8 +155,6 @@ Ingress Host: {{ $host | quote }} {{- else if .Values.env.DOMAIN -}} {{ print "console." .Values.env.DOMAIN }} -{{- else -}} -{{ required "Host name is required" $host | quote }} {{- end -}} {{- end -}} diff --git a/deploy/kubernetes/console/templates/deployment.yaml b/deploy/kubernetes/console/templates/deployment.yaml index 3606a25df6..3faa48f2b6 100644 --- a/deploy/kubernetes/console/templates/deployment.yaml +++ b/deploy/kubernetes/console/templates/deployment.yaml @@ -251,8 +251,12 @@ spec: value: {{default "false" .Values.console.ssoLogin | quote}} - name: SSO_OPTIONS value: {{default "" .Values.console.ssoOptions | quote}} - - name: SSO_WHITELIST + - name: SSO_ALLOWLIST + {{- if .Values.console.ssoAllowList }} + value: {{ default "" .Values.console.ssoAllowList | quote }} + {{- else }} value: {{ default "" .Values.console.ssoWhiteList | quote }} + {{- end }} {{- if .Values.console.templatesConfigMapName }} - name: TEMPLATE_DIR value: /etc/templates diff --git a/deploy/kubernetes/console/templates/ingress.yaml b/deploy/kubernetes/console/templates/ingress.yaml index 8d0af55198..288290c5c7 100644 --- a/deploy/kubernetes/console/templates/ingress.yaml +++ b/deploy/kubernetes/console/templates/ingress.yaml @@ -53,7 +53,7 @@ metadata: {{- if hasKey .Values.console.service.ingress.annotations "nginx.ingress.kubernetes.io/proxy-body-size" | not -}} {{ $_ := set .Values.console.service.ingress.annotations "nginx.ingress.kubernetes.io/proxy-body-size" "200m" }} {{- end }} - {{ $_ := set .Values.console.service.ingress.annotations "nginx.org/websocket-services" (print .Release.Name "-ui-ext") }} + {{- $_ := set .Values.console.service.ingress.annotations "nginx.org/websocket-services" (print .Release.Name "-ui-ext") }} {{ toYaml .Values.console.service.ingress.annotations | indent 4 }} labels: app.kubernetes.io/name: "stratos" @@ -65,12 +65,17 @@ metadata: {{ $key }}: {{ $value }} {{- end }} spec: +{{- $host := (include "ingress.host" .) }} tls: - secretName: {{ default (print .Release.Name "-ingress-tls") .Values.console.service.ingress.secretName | quote }} + {{- if $host }} hosts: - - {{ template "ingress.host" . }} + - {{ $host }} + {{- end }} rules: - - host: {{ template "ingress.host" . }} + - {{ if $host -}} + host: {{ $host }} + {{ end -}} http: paths: - path: "/" diff --git a/electron/README.md b/electron/README.md new file mode 100644 index 0000000000..276bf542f9 --- /dev/null +++ b/electron/README.md @@ -0,0 +1,27 @@ +# Stratos Desktop + +From the top-level Stratos folder: + +- Install dependencies with `npm install` +- Change to the `electron folder` with `cd electron` +- Install dependencies for the electron UI with `npm install` +- Run the Electron app with `./run.sh all` + +> Note this builds both the frontend and backend and run the app + +- To build only the front end before running, use `./run.sh fe` +- To build only the back end before running, use `./run.sh be` +- To run without building either the the back end or front end, use `./run.sh` + + +You can also run the UI with `ng serve` from the top-level folder and then start electron with: + +`./run.sh dev` + +to load the UI from `https://127.0.0.1:4200` + +# Packaging + +Packaging as a DMG file for Mac: + +`./package.sh all` \ No newline at end of file diff --git a/electron/VolumeIcon.icns b/electron/VolumeIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..80aa40e21dee1d5c7905761aa6c7800c52196f20 GIT binary patch literal 224817 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%0Dv&D8AHTsak19G~OBLPc|B<_P}| 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 + + + + + +

+
+
+ +

STRATOS

+
+
+

Version:

+

Lovingly designed & created in Bristol

+
+
+ +
+ + \ No newline at end of file diff --git a/electron/background.png b/electron/background.png new file mode 100644 index 0000000000000000000000000000000000000000..c69af6dcce5421a0ccd7922f4aac1f5140342932 GIT binary patch literal 222465 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 Bh*JOn literal 0 HcmV?d00001 diff --git a/electron/build.sh b/electron/build.sh new file mode 100755 index 0000000000..c27e9b007c --- /dev/null +++ b/electron/build.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# Script folder +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +STRATOS="`cd "${DIR}/..";pwd`" + +BUILD_FRONTEND=false +BUILD_BACKEND=false +ARGS="" + +if [ "$1" == "fe" ]; then + BUILD_FRONTEND=true + shift +elif [ "$1" == "be" ]; then + BUILD_BACKEND=true + shift +elif [ "$1" == "all" ]; then + BUILD_FRONTEND=true + BUILD_BACKEND=true + shift +fi + +if [ "$1" == "dev" ]; then + ARGS="dev" +fi + +pushd ${DIR} > /dev/null +# Checks for fresh run on checkout +if [ ! -d "./node_modules" ]; then + echo "Installing node modules ..." + npm install +fi +popd > /dev/null + +pushd ${STRATOS} > /dev/null + +cat ./package.json | jq -r .version > ${DIR}/version + +if [ ! -d "./node_modules" ]; then + echo "Installing node modules in top-level folder ..." + npm install +fi + +if [ "$1" != "be" ] && [ ! -d "./dist" ]; then + BUILD_FRONTEND=true + echo "Frontend has not been built - will build" +fi + +if [ ! -f "./src/jetstream/jetstream" ]; then + BUILD_BACKEND=true + echo "Backend has not been built - will build" +fi + +if [ "$BUILD_FRONTEND" == "true" ]; then + # Ensure the desktop-extendsions are included + STRATOS_YAML=./electron/stratos.yaml ng build --configuration=desktop +fi +if [ "$BUILD_BACKEND" == "true" ]; then + # Ensure we include the desktop backend plugin + STRATOS_YAML=./electron/stratos.yaml npm run prepare-backend + npm run build-backend +fi +cp ./src/jetstream/jetstream ./electron +cp -R ${STRATOS}/dist ${DIR} +cp -R ${STRATOS}/dev-ssl ${DIR} +popd > /dev/null diff --git a/electron/config.properties b/electron/config.properties new file mode 100644 index 0000000000..ed0a1d530c --- /dev/null +++ b/electron/config.properties @@ -0,0 +1,71 @@ +# Database connectivity environment variables +DATABASE_PROVIDER=sqlite +HTTP_CONNECTION_TIMEOUT_IN_SECS=10 +HTTP_CLIENT_TIMEOUT_IN_SECS=30 +HTTP_CLIENT_TIMEOUT_MUTATING_IN_SECS=120 +HTTP_CLIENT_TIMEOUT_LONGRUNNING_IN_SECS=600 +SKIP_SSL_VALIDATION=true +CONSOLE_PROXY_TLS_ADDRESS=:5443 +CONSOLE_CLIENT=console +CF_CLIENT=cf +UAA_ENDPOINT= +CONSOLE_ADMIN_SCOPE=stratos.admin +CF_ADMIN_ROLE=cloud_controller.admin +ALLOWED_ORIGINS=http://nginx +SESSION_STORE_SECRET=wheeee! +CONSOLE_PROXY_CERT_PATH=./dev-ssl/server.crt +CONSOLE_PROXY_CERT_KEY_PATH=./dev-ssl/server.key +ENCRYPTION_KEY=B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF +#VCAP_APPLICATION={"cf_api": "https://api.10.4.21.240.nip.io:8443"} +# Keep the sql lite database file +SQLITE_KEEP_DB=true + +# UI code in the parent folder +UI_PATH=./dist + +LOG_TO_JSON=false +LOG_API_REQUESTS=true + +SSO_LOGIN=false +# Whitelist for the SSO redirect url. Paths can contain wildcard `*` +SSO_WHITELIST= + +# Enable feature in tech preview +ENABLE_TECH_PREVIEW=true +# Override the default max list size. When hit we won't fetch all results for the given list +#UI_LIST_MAX_SIZE=600 +# If the max list size is hit allow the user to load all results anyway. Defaults to false +#UI_LIST_ALLOW_LOAD_MAXED=false + +# User Invites +SMTP_FROM_ADDRESS=Stratos +SMTP_HOST=127.0.0.1 +SMTP_PASSWORD= +SMTP_PORT=1025 +SMTP_USER= +TEMPLATE_DIR=./templates +INVITE_USER_CLIENT_ID= +INVITE_USER_CLIENT_SECRET= + +# Use local admin user rather than UAA users +AUTH_ENDPOINT_TYPE=none +LOCAL_USER=admin +LOCAL_USER_PASSWORD=admin +LOCAL_USER_SCOPE=stratos.admin + +# MariaDB database for local dev +# DATABASE_PROVIDER=mysql +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_USER=stratos +# DB_PASSWORD=strat0s +# DB_DATABASE_NAME=stratosdb + +# Postgresql database for local dev +# DATABASE_PROVIDER=pgsql +# DB_HOST=127.0.0.1 +# DB_PORT=5432 +# DB_USER=stratos +# DB_PASSWORD=strat0s +# DB_DATABASE_NAME=stratosdb +# DB_SSL_MODE=disable diff --git a/electron/electron-store.js b/electron/electron-store.js new file mode 100644 index 0000000000..3190c60983 --- /dev/null +++ b/electron/electron-store.js @@ -0,0 +1,48 @@ +// const electron = require('electron'); +const path = require('path'); +const fs = require('fs'); +const homeDir = require('os').homedir(); + +class ElectronStore { + constructor(opts) { + // Renderer process has to get `app` module via `remote`, whereas the main process can get it directly + // app.getPath('userData') will return a string of the user's app data directory path. + // Causes `EISDIR: illegal operation on a directory, open '/Users//Library/Application Support/Stratos/settings.json'` + // this.path = (electron.app || electron.remote.app).getPath('userData'); + this.path = path.join(homeDir, '.config', 'stratos'); + + // We'll use the `configName` property to set the file name and path.join to bring it all together as a string + this.filePath = path.join(this.path, opts.configName + '.json'); + + this.data = parseDataFile(this.filePath, opts.defaults); + } + + // This will just return the property on the `data` object + get(key) { + return this.data[key]; + } + + // ...and this will set it + set(key, val) { + this.data[key] = val; + // Wait, I thought using the node.js' synchronous APIs was bad form? + // We're not writing a server so there's not nearly the same IO demand on the process + // Also if we used an async API and our app was quit before the asynchronous write had a chance to complete, + // we might lose that data. Note that in a real app, we would try/catch this. + fs.writeFileSync(this.filePath, JSON.stringify(this.data)); + } +} + +function parseDataFile(filePath, defaults) { + // We'll try/catch it in case the file doesn't exist yet, which will be the case on the first application run. + // `fs.readFileSync` will return a JSON string which we then parse into a Javascript object + try { + return JSON.parse(fs.readFileSync(filePath)); + } catch (error) { + // if there was some kind of error, return the passed in defaults instead. + return defaults; + } +} + +// expose the class +module.exports = ElectronStore; diff --git a/electron/freeport.js b/electron/freeport.js new file mode 100644 index 0000000000..519c500238 --- /dev/null +++ b/electron/freeport.js @@ -0,0 +1,59 @@ +const net = require("net"); + +// call method 1: (port, cb(err, freePort)) +// call method 2: (portBeg, portEnd, cb(err, freePort)) +// call method 3: (portBeg, host, cb(err, freePort)) +// call method 4: (portBeg, portEnd, host, cb(err, freePort)) +// call method 5: (portBeg, portEnd, host, howmany, cb(err, freePort1, freePort2, ...)) + +function findFreePort(beg, ...rest){ + const p = rest.slice(0, rest.length - 1), cb = rest[rest.length - 1]; + let [end, ip, cnt] = Array.from(p); + if (!ip && end && !/^\d+$/.test(end)) { // deal with method 3 + ip = end; + end = 65534; + } else { + if (end == null) { end = 65534; } + } + if (cnt == null) { cnt = 1; } + + const retcb = cb; + const res = []; + const probe = function(ip, port, cb){ + const s = net.createConnection({port: port, host: ip}) + s.on('connect', function(){ s.end(); cb(null, port + 1); }); + s.on('error', err=> { cb(port); }); // can't connect, port is available + }; + var onprobe = function(port, nextPort){ + if (port) { + res.push(port); + if (res.length >= cnt) { + retcb(null, ...res) + } else { + setImmediate(()=> probe(ip, port+1, onprobe)); + } + } else { + if (nextPort>=end) { + retcb(new Error("No available ports")); + } else { + setImmediate(()=> probe(ip, nextPort, onprobe)); + } + } + }; + return probe(ip, beg, onprobe); +}; + +function findFreePortPmfy(beg, ...rest) { + const last = rest[rest.length - 1]; + if (typeof last === 'function') { + findFreePort(beg, ...rest); + } else { + return new Promise((resolve, reject) => { + findFreePort(beg, ...rest, (err, ...ports) => { + if (err) reject(err) + else resolve(ports); + }) + }) + } +} +module.exports = findFreePortPmfy \ No newline at end of file diff --git a/electron/icon.icns b/electron/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..80aa40e21dee1d5c7905761aa6c7800c52196f20 GIT binary patch literal 224817 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

m z|NHXZVIo4$SH##m8hQ|ErR;Q)o&|HG((A{zC6^$N>;Yl`>frU%kQ`!6zR@ceVtf!y zG}0aw993!yswj4zZJ5w+jIkCvyfhe8Y84n^G=zG4Ww27WI&zeT`H@tQEJ~}sm$_n` zVLXnI$2Zu)7?A)2vOtiGOYagN&fx5Pwt0{S-nweGQ@4AqcJ>{(-i#LOL52s|f-mD< z(M@0}g?@?_WMcGtlA2j?+eauOo(Kda(5iReL>sW+xR05Y+<ixz592RY^?&>{le)IlfC8HuC@LUWJ!1|y& zIsieLoZ9Q4tZiWmTMA1v%f=;y?_0tfU~pdwd;o0&UYTw5{b3ecb0aW75CS_+yWYs# zz_-QpB`(wm#W+TmUP$D!N*Zr`++!#b?ye8>dhFC?^J01}jxW*I>n6tMA6frx=FIYy zp*~J9ID{!u+S-@7=%}`UxagO*NZg{{3H_jSl7Md{Z0@ZQP0^<^u(0-5=ZZhoCO!)f zl1Far?8_+e*u1fR5d zTHj;V&M<326yOkn3f2gld6}|C>?_Q7+;@uvxDQxBoDlv=fb1kvCgeOR2KxDvgm`gp zciNxE##kXc^G4ZW(1eqOK8>p^JW)wi@2vNkU*)4hIuOYUu<&E`)|Y;0WbbN^UV1nu zi#9Pw`#m6@RPMTmLsP*fhpu=^==!XMHWgI1=I5T7T-|c4DSarbPxN+a})Rmk03we3X~xPd>G*m01HI-CJ`~9kIm~ZVnZ`tP7OC# z{#?TcB$uAHVn0L8e#!&^vVl<=isAt8;C8Z59M0dV__&oj^JaNnZnapwd%U@1R^jns zMD)Y8l`9L7$udb10;m2-Z!;%iqb1lus@j5#!SIQU$@A>w%+g^ z0Ws`Uw!T@$>_BqxyGBg|`K)IC*Fyn*tc<^X!xS@K&A~FkM|Y#f1NJN+pdcGz2hl&0 zMju{;hT_==%0j7+uLG+)CI^)l>C33uUE8TyXec=J1~Ts_cDtjk6|g89ICByGJ%BAB zENwTHd3E~d0H>NMH(;@yNzTPRGpT?kAOTjVep`bQ{)FaJ=hsCSGLUDCl&2O;5EnaL z+r@tBlV$DnuHCT&YtJWX;2`bvjt!wpaF0Vc-G4vFznCb>6zmh9G5E#+dr9t~F9D;j>|@uQ}{do_cZ#W+xrO zUMQsaQOR$!Ti?=!sEau7`dah`l-0Z&u7fz{`a=ebxt}uDNzqFz)1dq|XkhRVT zX{vWWit1npGNjFT8N>`;x$wJVh=ix#f>86>k{WP>9U0n51Df+Sw)(t;y_civPW4l1 zvEaAAS=x&^uNbSlk)5ZqXV1VSS`xroTOH9pKN{9T)W(4s3>{8{ROJ9c7ztZMHrh0> zW!``U`1S#UcRxE=#tv(9`RtR%Ky&3ga#g#)$=3hKbW}i3#dj4u0swv7)w+L07mk~t z7@wlcn4Zxl7K2vWjaKjXBR9qT!6A=w4wEcq=A0tqfC*L*bqU@`skb^}enRFN7m;BW zWK=zgGi5);DbxMFEET)bvfDhys;88Q*T+!L{d$%$RsE}M4pq9f|CUo=CUp_V0&_Z7 zX|zCnGG(Z!&6?v<0Ay*T^#Z{_OGEM@U z?m2ef7;C&hLI(AEjnR9~|yl{pvMm`H3s^LVqx zNq-yDAXSZWffVMcNGJt$&g+87;*Y@E)O|oZ2mq=ozQ2wh1GnMzM{I*yVm6LdRr3U# z=OyNC3OYkK{bV*pd)viae*Poc3mrEa%HU`D6aC{mP1broSFUk#DA>62DH0Ku-AdBmB1!{xnshh(YJSJOt}y4)9BqTnpOB;w zt&(T)zYK_KdBoN^?-%AFhud@<(Hx*_ZKfpn?8=4`590~-%E7ETCpwB(WkL_h@zz7Jr17$J4 zUBHu>S!jv)28WpX3B4*g7z;U>tbhOUtJ-0^9Tzwrt46m}xmCIHHlupdBuRG>{M0O3w|VcG%gUpBQhG7qMc`2t5u+hpl!!Z>1znRQNZxU=nnos)Z|rmeXg%;Wm~j* zMoO!c>f#!sW8ouxCos?6EgAx6%+L1fjk!y5H3NM{Gp~MXio05*vSg432g&WvO~(Fn z@@C}V{VrH-qz{yVj!JqYdXfO3$4%Rg)6IFq1lwHOx$Q z6|OV7^s+pNc`feS1~mSid{6{{^&z!Hxpai#^z2bwV&VerK;uW(EsNKI;qtXF?w_2-Pc=`4oA2l?8X9m@3Ps92xO z9_+Zg;;^Mx_No~{F(9v6_d1)aNJWNUHpZ*V{`$FvowrzS*pOCQFYdhmq-Bg+a4_jd zm<_4tzd!qcz8qltwpe@jx3d`5F%tYa{xkct=QS1Icg{tlI00)DTHGzvvz_zZ+O*5< z=g;wh%VFm!dN||(Ob2MYf!=*%L)IzX9CrmezckKC6BEsO_kyO-A9U$g7w#-l{EAe~#vi+q_!<$jCq!C5Y)_;RbnA@Avr7o4?szwKF6Q``5UNKNP{wA zWae}by#P420e!V>5t-ooM8+kd^x!zYm$Nl>>H*LO$s9tsG=Sw%c8waU^-L%k1Iz59 z1;A1+#p~|1OK9q%#$-(#j=mzdeUI?%=&7}qai;3nr;4n+if$*FxI@$FnZi%^@PV+uquj;fO?J5uDSY&U>x8kStqT4L&F_rC!AL_y{vU zxLfT8&6qKGNpxzlecikIlsO>59KCm4e3;-lPB+T!dv;cL+AkuYbac`5Lj6*Rj1*X+ z0|z`TdhM2m)8Iyd+75sFVz&lB_J11Uf4}~(#K0SLYn`{w7_+Gsrc4^~j@BGF{pQ^f zu=3ujIz_EL+19?l!=R2fiSl+2Q@w>cK=R$Zfo_ch-bs-ka83eLr z1XWn;Q;%O1d=swzE3bazUgxKO)OG)*H+Q@9V%x?!ag{OyFau|JP?y&VoLtj0s+1_~TG%^nGQB$qmuGz9hksl~7tTaGp{!S* z^Cav#n1H4KE5SJs0vBtYo(ea?{ZnJ;UKt+>&lXSinsXMug9=vv7@RlHFZyUuH90hM zi(@j3SAfyY5mv0#q5?kTQv4r<7^H7Ps1QK5BKHWm@ypnot$-UO&gsJjyOpX0+k1KU zox-{){WJv1evfNsg_ywjC#{N$l zGj|2rST5}@-Pa+>%v7^~yOH|w@iLs5i48PK|vLF)MwAo&>3kDR>Hlf3OCSJ|ei znK3^cH9FNWEYdVf?Je6n?*d>E(Fc`ggwuejhhcadof2=7>ogJb^fMX3&q zeKG%0iDeoB_ltVL3A5i?6$ZO5M&ZHmmMG*vnoG>+R9KZ@--M&r;G2)rzcighYQIQ4 zp^T(tL-`&c3@QOyoxi^#aq^0gk|Y^y6wVa~Wf;>7^D;f05i5tG(TA}cf6V=wJBy_E zDDrlT^FojV4V3T@udIxmNRM9;W@q?AFQfnq>d^C{k{(*Xhdc+|#r&T!_Mhwfzk9Z5 zV?qGGN#j!BOe6tka<>@y$$WrTPwVUsHbIO5yDWBP+NGTw@#SSlIX_goMv6aYfz8(< zfcFkKY4qM2kE84K8iAa;lhjbiTj5?|Nok9W;miUVEhqoA{3_HZSYV5D#+X3mMq{&z%1sNwQ@L2nx9N7r%J`+*e)r2Wl*~1%mo{5ozKptGLT3 z!TLgqgvtqO5$-EF*=_{ybKK*S@F&}XkTVf>k}-x^b#*y zDn`$vKNYbvyq;XZ^`GMfL@zs-M30O8dut+STM15GU(M|JStgna5h5Yz0YUzajUb{+Zo*(rgCwR2_Q&= zWrW5Q!Z0S?0IV;e zwO+bMaOd3ig?x^*O@ggIOZk^W{nXVG+h-FYDOOB7MeoI}92-DF>)9$LXs<99PgGoA zEcBR4&Ujm9y}iBZ@$5mprHEbCN#E4ah@mg>)6LO_2vqdUkaz&}ZrRLu;a)QMebVdN zUb*{k9za^2v!+w8`g_G{>rT0nwZ+H*LG+h0`LVU-w*fYo77F%n`M^}v-;CcDIE3z} z0;rzso1s0=y!AN%US~F+S$;=cTg`Y&{q>YrQ?nqQUSr6z;R?>`L{#LTP<$r)f`$^@LQ+tJE!1_)044k?c$AuBacqpgp@>l|-?qs_&Gzgd zV{6BBo*#o++KJ(f(Ks0#6QfEOo55{^8H`)uF%E2j>U|DU;hZQGbivk^vN#nZj1L?g zCu5jEsFwr|1f}>r)!4!~6|XRs6jKx6uKMmIEC`iMVTb}o`HT-ygEGeg!*pF`$ z!Y=J|57}uvd|XK81blt;m4fUYxrih9JN4NoKyfR~EfwnsqN!qcYG5PQLPVftY9nad zt2e6DFr~-B+c3Oe^ay@=i}BBc&t*<2S*>olctPQF_!crIhcK=t%|LEMtLW_&YxCY= zq)f%&bh9>13gt>o)@|vZYqMZ;0+Fo>7H`KP^#J2+W zNw*v#Ams`{#>zyt%WZ;5 znV-lZJ&%|3_2J?#*?RjjNI%6KE0_wOIt>MQrAiNC+T-`kPFBfn3=e0xp#iu&YSGfdkLUXLIq?hMt*2Wd%Bs)O6V&siaBe- zR+~I5tivlq%3z1dOF&IySg)DA zE9v|j55Pf|@t-BcJV6Yj#@VZGi?2YGNy@VIyHnL!skICdy*fbQImx)CEc1HNtb2QW=chj>!aE#` ziA{)yBgcLsFp@C1q`cUZXK7-Ccoq5SG(<94;{i*uEZ)p!D`&ye&m1s9hNIT31EB$=GjvD}EeO6!ufPQo}$f zJOD1dsrSl>7-}?=FN~a$Gy5&uW*@GLK-paV`JWW{zo0JPMwhZW%^EfaJ`eL}Xd83m^=0X?d!?5?JDCHs}R8=z+_PnH*tP6tD%D_PM0s>l?996!9ExTi!F5KZVlBH6D3 z+T8}WVQGTH`wT@GcKJKpGo!}8>g$DOM^&aEvtOO#guqVh@E(|^;-AWzHTxal7e6XH ztxMFc14o|zrnjt>>WUEw>QFbr5hro`m2j4s^n;P(?w z`!$D`qz_3?1AGhlKAIQ*40tZC;_s8*dOpwR*Pv}mpA?uUfKl0M zY*K2`{M(_qMiS#vw@J44CPL_C8Qth> zoEi4+qlVB*rmg!~0u3?n>>B~L2yrNJ;-|hCV_y;O|3XIpr*SkS0e+|0HP|*ghjT<$l7OkGjW+3Ic?=-?${`6~Ac^*h3LUxq2aN>9)F z)pt251t14huK&yERxteK6sHv_0oU(a`44f2pqqY%NU=gFy1o?rq^BNf^i0u>-m%r?P zABZ&!xKmNbY$mPnXTJv#xSsTcn;szXDQo_hFQl3TWTTy)IlUbhQ2T;`K!3h)J53(3 zJwnlMG!W={2<{23uQt2W+K--}kHBCmo>5@WNE`}TZpXnBpUTd+fH#uldf6!g^y0qT zi!T96)B{f?rI5oO4!Ma^dcssi<-1ZR_NF>yQ_R&+&yzVz_hooM#Emz0zkat<;scpW zr~e^&_y>6HXMMe-T)XlXAE+Jb)!zMw)uaL^P}@91Aj~WKxaDhGuvw0YM~lJYOMTsg zfChZ?9?VZrZN=2I;0akuTT@VLZisLx^u??VEpNFht|tVi^q7o_w1TM_kbCZgk!Skx z$LQe6nMOJiE~?lh`Vn(BdNhA*tMJkPY9kKpzBxg9|JU5Mn9nE0z)R){N*Gh(QIHO% zr>)3Z_Ag)8>%<@pSR_z*kOgs34sK)nxdeR{@7Emj_@BaZ*9+ZkcgT<%`v>H>OQUJ^ z2xnU;lFU1G`E$U^7_s`7#kP+%0d{El`OE`P zyo_tVhooaVT!O_LVugwj(yG~@6xSg9<{F=pO3bSmieDxTq{BOPu~VHPaEUkp+2S0x zkYCH@9$>+*BzXA(k5WV0Em=B!U%6xA;C7IDlNOhW#738bhGP~;VTg&@vIL?^s*g8_ zl2orG2|4a)uMwBvAzu$S)pyT&@>}#(aNg(=O*1??=Es6l=m!5+Gn#X7$M&E1`k?&pmNf_^W+#j!=JU_U=^~V$0vJ#=U1y1NyLXAEk!@HG&DF|P`E~4Pf zm@oi~$~PY4k+`+<&0mI;W0$qomZ>Zu6CFWSJ>^vd9CreaK+@vU+xdeSu=BrapK*{z zPbyfNly=0f4UQuk)M{uZx&UBi;uurAN@$;NnhP22*Vq$u&3m%uM0 z;i>G#-&jq;UUmxCR>g4k;@<^v^=uh6+y@mrWcQHv+^Qa0D9b|%AMe!r)qpyB-dX(U zi-iDF6ie$KCNjn)*Q_)T^39n{bn2TY|NEklj*#N%yZ_(*VpH!*Rs(dl7r0x zcWK=m1pqsZFof6B&u8byZE%~64q6k>{HR_gwUPeem{IR~ul^ zHveGmLcGsW0QNA?OG@N*>-?(T(FA@7f2wWvtr&{pIu)kdB53O7m#e-D)|M2qKDk_k zcJ^h&K5qK#nJVn3=S72%eDVUZkC+DXJMw9FXY5xz%RJmWx@{Uy&tyJ{_sQ=(e)Io41Q<$-4<84i?`Xv17MkdFw)f|st6k6!1yDK;-#}BUk9i~fKY0mvvOOrt z4X6#)0nJe*(1s?#;8kvg+U~8j}2ER!O{C4U*M{j$GltAE%B;&yP$rgJ0HG8 zBbJC)FYknLm&7W`n=A)R-ov7KVbY47?&jKs0k~F)@|pcjA+5{$t^D$8;dPVl%^eq5 z=vmh*nhY^lvsbdo!(gF%@yh%?7$4olPySbHrc(rx@#<$tnQy^xFbZ7`w}$FY5X^*e*!URTkMD0M?vfLRN<|nNEs5>Ug4B z5MV!kzfv9Hy`|=vU}?GYve)Bc+{=Y$SNYeNDt_KM`N#&bj8;=TpLEdLFg1NE ztCcWl3P206VT_up|53v&c5gPCK!~8l18V5wy5(&jPqB$KLP4V1 zn>!UQ%CAr)`VrPtNzOd)sg)@XW`f;$w;FZu8SNJ?DKqm%AQ=2z%{Aq2$s_B5FaRhA zZIDRD>Ir=Hl zKl!&RZuwz*0&kWjKF==tl0O{MwJcj+?31|iFBHIe>%WhS%@i;8hBA*s;m-vC$#*eDtBK2DfsZJ$-fDDh>{XN>0nHKP z#m|X;&nnwMQ7v}Y=qe)hfx3mEg3%t0XXh6iHF~I7qV`>D5WxEMK;S4vCVyp^IghOD zV|?(lL$>aa|L?+->;}+dS8NB|2iy86sYEm~!+vQpkQ}|etKPMPYQGKJH%({ZJ*db^ zEF7RFIMKJe7h}QQ8HM%-+tcoNBG;iE`G-O7)su+AM9@hXzbTflNLoTYJDi;m?`u>y zY49-P=&XeO>}Oj-{H@)K)U=DLl#L$4m|x0O+04as(e9?&|KKJ!0Sh!i6#c{*NKLtmFVLA_7D?h$?#=$~k=Oq96hb*3u>e0`Te+tQNZY%-ZI3~I;b+Th?E z!LTx2o60}uG-?cg#twR*1T&`dFQSHs{J#923fo#fd{=8o1X}rcQ#`iUAdjIcEg4Bv z!JWH|U|q6v_#}Wj+&@?;xDfM#I2>fT2i%S(10AnYrp7)CF@6=pF%*-b*buqoj2AN` zQr!ynYA~h)x|VN>r;B6 zd*+W;bNMm6g8jV$s9JpWgY`c*-<~G+rY(6Ro;4xh>0SJi+Utyebbly=O~ko~F_3d` zv)5mPM+j2{tuB=+Ke#<14i4I_Tc@7|U?ioo4~}B0v&f?R&M5vI1sy5!=LzceiChd)tfYa=u-Pj*Sxc7MV(zX%3)zF&^5RNokZb^k?at;H&V$$pMvN(n4K%x!C7QvO`n_p1^Z_^jV3 z?lTmEY|4`vJK}L^P}0~25jLs-g8JYdmo%Y>N4TrMVha#+I(Q?lbmd(;GU`vSr=&)n zA~;2z(iyrRoyL=;GUjXaqL^9R+soT*L|qM3wZ{CN(M(0O!FqSWcx)8ZBfCNt_cO{X z6XEqH50(Wsn^`)?4WO~|=ij)n#$`7aBDMH&ZjnsJXWLE(0X%u9uz!Sbphsah)+JfL{B!goRDM@fFV0DKu zb>a2g%5BtdJ7{;4SNyz2vt~1^T||QDp}1IYS9JfhsNMIfk7O3P2FykK{qk%cD2fmA<%d2M_8X&?goi@RpDPOH3v?R6*R;i;N z5Vg8L;p!G)D#-PK>;!}AD#}guYw|P0d1uG93^T>Hzf1mUwRTxQ;$G@}rto#W+U;5p zE`2Zi0AKdP#ixk~z~Po;4rNLd99un-tFxwT8GfW_16PH0^LM6?e_BrS?pW(XS`WD8 zzV~fq*NArwlnSfKld3NE%ZxAM)~WDq*kwcsY=(^eD~4t&NFI!D=Q+=YIs2-U4Z4jv z(%eA~lfIngps#zfHvZE3w z`d!m9i}z=RnG+vy9dtY5zQZ?ke&Wjp!avgkf=F}|Hc?y!yL8J)KV|7Q+hZ=YJF((g z!Rh<8!{>oF#c;-XH1+AJ`ew5%%u^{*Q(V8In;;RmLhwMM2$*R*jV0_OzmQpWR!vSz zh!1j!Weqqe!?n>}j`;$2tq(w%&YK6dO!C&US4@?^+mrw>#@v8U^`+Ct^{In zC>B>dS@?UePLD5_-4WJ0>bMA>Mf!MmiLli#$SWHs2MKI!8m z&*^Mv!W3@Ub{ay>%y}e#eGq&TJBaS%xIN}={5EalIVG)>bs14L+bNcMO2u60o;T(0 zy?Cjs(J*fU)!3$74e9vEJGjKhghLH6iaI|B<8=5o+H~AXYqCYU0$AT^KN8z)DjLJ6 zdv8*!MpT>)WHLCIOtbB;@o9z%Wx7qD`mg<(Vos0}x-7bOn+{0CF%2s<;xx$sDTm&` zHPbZT75uaX)6Os0&_qw}WA*Gg+|>sU>u&SWgY?g<7xMe@1`Qs5a&%Y6_HvEO4u?1? zF02f*T+YK^csUP^oDfATi+1uP6MS2>W!rHS;^)YO+R+s!afv!b+p^*mp&B=)Py^-7 z%zmhkMk99X`ZU!2)iNKWlM&#vvhP;~ejB?4cfR8=0co&P$+W_K%d1>`)wQ{$bvz@4 zzw%l4QH2$@=DEsfYa16dmdH*hwO@`@H3D~PjE3Bk%X#%HH}92^Q?_td>5T{D?k#(* zhKkk|L(MVj`#Q#5pBQ)%incsXiSFquwwgV8vP=ux;a0e@K;+-BdsXR-n|wB1ZTIqwHOke!p8pSJ%U9)BQ#HN&j_+?q zzxENwnNTT=e4@gqeF8=gT2jlHM*3Dw%~cE9k_vJRs!I40OH5ky>-+XEl)Z;N7T-B~mKu zjnYGLUDBL!2MXKM&PX$HGj3>Pzo|3@N2yth^9B!70%H^EG3{nVUPTyBZU50N02ix+ zS+Si`1IdxTxntXO#cUex-R;NX~I>*U(wKd1;N_cjRsq)IBlre!#q_j@GQ{7Cy;ZQb8xc){3~L3usG@WBIIe&kkb-7ZD_tHVz<9% z8zKG}5w2uqm~+pUR>$__o4cJzUwo&ht%mY5heL#31Wr$$ME|MGYXa@b8H_P*nDoK8 zn!NLm$w1#H@7Ux^GHlkG8N^IDrMg1!Rc*2`G3Wge5`H!wJ2k%y^AhQS(!Jr*grDa; z31cQ-eG?(Mo{^1)lczo6Foz!{5pO2bW4qJ}GbqET!0)1Z=+Lp6aq~-1_}Y6Ypi2C{ zzSf-a-j>|gWg|?e^V&*KpXp*LG;QR|;$<%1)wP4{Mpd-j@Y`~O%! zO`Kj)+WM}3$PMI|{q`PAZmcl7Pqv+aW&Qq5Us)n-PH&j9Z_*U|iMyGOwrvqOlixks zeEG9u_NI8!2qZ#KQAaR-7)Xk02X1#8&)PZb zb6QKRx;yC4K1*66v&LW7@|1Bg(BMoY21f`hJ>YI73Tn?>mG<~r9pKzB;84c*5lyed zHhkJdd`_M*H9EQW8C~*$H1>Nu45xni(sMxY9ZjP9-YqUH^YsVXhqq~h@?JW*@ORBI z$QA1kQJ|akuo~NMwHb0uFGB&yELU-|-jH*0#7dX`8se?oZPlio7XQ_yDdrTI#tY-+ zm?TW+cOYkR>)O~WnI==)fY%?ZYxM6jF&oN?!AxFnro8vQ(a(gN(Yr9b=WSGCIugJ7 zy<)}Ta99Hul*cOyxO5n!xU2>cln?X`XLfz+O_(M%SCqwqkJizQ9aWT8?IOhJnsl<)}^K%8vkNiUZa}Moz|s+>l#~zXAk{Z zcQ|fg2y(mK99)+ZqQp;rpGI;;a&FCecSyNnZxpV78xGstaZLOERb_JgJC(Mp_r5E! z%QOcgiukb}?bv8wJRMMZrDr#;j3y{j*&gg4*g+fWuo+)?{~L7sKjq)#ZYq9V&Jq9f zba#E7N`7;WD=*`T4$W?#9T3?~$mDZ(awfEK+Iiq^UGv+|tI9T45I%IHHpITI1d zw=G9fKs~ZBE3sPirxz&JHs&-gW3@6IjNNv$8ts!ava~64$5ktwVO|w^#H{`-s9|K^ z@XU~b;56s}K`*7FtFppI)dAY${53L8Yv+kLrJJAcm$nu@GPtog%jIpn&GXY@A*?yG zm3eX~R%lnHO7QP%$60YQXhQbgfmS>7|+Kwmn+xWW^-16=(ro)iYCUy^i00A7h`(aJ1G+9G0NV`c-T_+ zjL65|OU*SUvbuHgx~-=^%+^C?%^8MNR9WpZjY35VT*%$6ngSlu@zIN^Rt*hbbw~%* zwc`V>_eyJ^jnfq&MzD9d z`=b)}Th%y*o)q3(5SN)REvXh*$6?DLN9tSRX-HQK{5HUDsDA-sz3fo&6{VE{E}7oXa~hpV4m8a{4BN2N$YHL7Jtqj zX+at)Uz9s&ri(owTFXRLv4vypNbv3vT)VeK_|gg2cl&saO3t%reu21gOhxu=uUC%$f_AS&hw`iy7ZZES>Tq~MNJC-L0GcyJ(o^Hwk z-5-L9MW0R1ypQBddG~GkvMHiPa+L{YDQi9%9jX8{m+5eB+IUvFsNnJMZsJKLNsv|C&EBE1_}U4L_4ut+!B9bMI>jpIrAxf&Z|={}x}qM-F^C$J zbFlPo&knH4{e9kVLoMr$+t=BF?qDKd>G4Y^yG`4e8*=J9T@7H}+p}1z?7eB_s{Y1L zbfPPN>&T$tJ4gIAsY0LqoW~As%cBO@vNsa^DGT#c`aiqAHKqC3;1(9ZPv^Gs=Mnm_ z;Kz@onLSGIe}BAA=NeyHuC(?DxYIb**$FE2A9cQ=2*L>HLvJpNe>XD&)_*%WbTo zU|(gY=lc8uBJd1iz>n<>$5t)_6ZRpEA3;oB8c~Xi%y?S9!vdqKUL)IR>^5F!pow zB%W_B&yyeDKM-lEXLh|CH=X2Q4!^U)O#Kn!G~@|)Q8R%$E(b&oMP0XE4jSDfjd z24RZNj$C&kCCQ{gP{mSxG!X1dE1FC{zSGH@nXMI4drIe_K|mS9uEkO(Qu;(oXb0^ zHo_cPJeJ^^GbdvlTANuoK1=jGzMjD-QmEhPxMZ#LYpO#JoJds6 zVOvprv=aKmaynJe3Pb14qE5Q~)9ly7668cG?LTj=0(@)cByEINyaX&CYt90#2EedT z6cak)p%jOCC?zry_tD;TKZvzFjxX!k0V6BvE;v07?>6s zz1p*Nw~{6RKdyOWG!OZMpzA-sT~mMPw5w@FPVh2^pwYit$yp*bo{0{R*9d)Fg)~q> zZP_+R-f?pPqBXi2N9<5*xn_?lV+4|TX-jWJOvL@Ha7xg6-o?vuP5gzj(;KJSjFv)d~k^n zyL+o`^)Nw2r7PbN8euw}$}7-SS?u%Z&J?0mYj1D3r&u!#jd~|`voNyt&rS{WD0n8- z;W|5884gk0iK~+%vAD(i8&9vz80Bj<;4McYl<4_>Pn@l;`;lf%XW{`fXG2)(c-HLG z61&HP4i92T$FkiRwN85)Kb4XzUK&xkKT!XYnKXCF^=9F%vAfsbIvr=mg@yCH16Zzy zF!3ss*5JUs@g5|(UN@TTgwJ{fB(?79^=_h@9=T8*yHMW{nr&D$3`R9ItE+{c54!8b#597aqLuFZ^`h(Ik&mpoL%SLMS z|1|gH|4je!zvqZiA1b+*CdU-AZLxfnPfX<)l7(`n!{(FQ$Qg>}s+A@sQ>aLe zh`B=MrU(%!IcEF5*7u+I?zcT&d%j-J`+D#FdaCD=d_E*6!*zA}IY}L`E~Qw>dMWpc z9a0qLszfrHtYG=*9mgIu$c7%mu=gwEye@YB z@~ac{uCDszGq8<@`wKq%PS8e;lobqqx2_P@Hcv1po>S6&t$A6=)1{JDAZEEH@nVod zIx#t3g2G;9zYT;3HdXaKp`! z>t7dl8Wog_(ASHdtDRMr6^6b{$D2>>xCTl1E|1AtLZ_%KQPe(!PzL*2$oYDW=BQBC z=oN>^oZv|%VQZxr&&kT%hp!%!Pd=$FH9ltJzNS@*V~Eh{gRen86QVMA8IKAp7_amVK6k*q2}{ueNY)}s z*}ZIwfu6pOjFxBB+^;qHTJ@ppWT9`enV$PK%e$Qy(^npuSTlca_tG?yQ&yH5UhVvpb*K-t9BM|CbJq*=8d--X;EWk#+`?Va-) zHAh~qi3Qe=c*(B)UP53%kuXaY*==$3~=-tOTxU1 z^Gq^gC{tmmg|JJD+4kq;W_wF%F_=vGfpnc6+4k8Iar}%na%63uyCrQA1ve7{JKJ2k2P&o37goGaz-_V)ZI6%som=$cfn^V+V_XkH_)dvAmxNtG^Q zRCh45Bq!~2^1@G(G;|*Ga0-hg4Rq{aG$clCJ>uZSV7{QDx#+8+AjMcTM7=cJ(9GNm z!qPcid+j_Y)g;h27h4DS6@44azcV5c)_QB%_j_+-N?@iYd9|}o_sd4}t6Vup2av?k zn|Nk`vqG|$qLe|_*(w`M5-p4kdb+ZRuioEGzlHiAje~w zB^R+?s6FV=@p}s;=z^#ksA{{Li`Cwg1F^*wR1sdHFe$h+L{auG+j<;e?ta?*7Ate8 zdhwZQNuA`P2qpb1P4QVJUi$vvKGN@GMW;6O(f0 zM`!N+vB_Mc?Y4w$q8kKIp8aeyfO3qmEcpbxn-o+Zo&}?Q~+!pTqaVJwmY22@Y?nfQ5QWRy&3&K)p zgmnh{pSgW(MaMmzbBDany&N9RmpiCNah&07uSO&Fl1SdI4TRtT^K%=kw`=@ew|yCm zVo+mGh2;bnFup0U-;|#--!r8~3+zI&!!POCpBc_Y|k_=u+8_mN<6d=Z>whTcyKp? zwuIiPzMId^1@uqWdH$GL_6fQA_Gl8X7Fe4o`pPyOaEtq!bI9Vz|3qrPsE^1Q6zth{ zQ?3oi!f8umFX6K)nFAj#jcDU-A8OyI_FXesS8Dsf8i@5CxS#pG(@QlwzBw^61)F(r z2D4mO*l|2;vzg8cLKBJmR3tV3Gr=>yDy3O|N_&c@u7JTtA1|c zTlspODY*kfWEm1Tn9?Sm4bZ|yX9&W@Ggq<1_I0H7l4sq}5-0VwZ1(dD34-1oheW;d zzIfUe4Pq~no}}w*;e0;X_M}ov)b?WgT1|a)X3px9yj2#O*_Q(e|AapLGEUN%{ovfH z`pb~`Zbw!#W`^vM+-_DrcoyL(TDgWP2+oLLS0IH8;(@7VN+P_r>|rJ$ss3;cp*Y8Y znc_D;(rJO!jdc3q!^~q%Vud#8SS5SIr+N%(} z<1Hh(@11S#H2o*XQtQGniH&1})ZTTN+1q~&KDMpv`FO|g{FY~3yW6D*(VTK)o5gdY zg9whwTG|Q@{UeXZaI}o(gCxT4xn6%UECX)N3gT$+^w8MzqX(28rR1_xn+;jjA1l|$ zsAvcW?e;1Vav_a*QzJ~H4RPV@g_|YE7K6hWw~J|lkfOwlNQ#qvgS43!+^}FXf1LVkHBWXU^6HpAIX-XwE06p$`AL4pH1z=o_Su zZ=PUT_fBbjoZNZ)&vg?5$2I>tsKV!YuuNIC1`Bxa(a*jLJx5=ul`Kg!@XoP8J-_Fk znf~#t`)((Xy{sM#J+kB4<~+{x>b#U`Lmy}x3{7i~S6(bz!QWUeSJ*md6SpDXsbwSnxcl*P>NWB2Zul}nt+cH6#m+iB|Q4CJ8C(VELA8^Wk1^?I6?PbVDxGV@<9tYpBH+qfa z9%ahXLnlRS_C6JU|Edr2(4})peoC6-`fh9>TZm%&tr@U-`36yCVa6=%I zrW;bf8a^uwL54`rLiTO}?|8ubb{EoS zh-Bb)Bp6@j8pP5AEn7)T$UF7~L^%wCiYB7nrAY*W0&GOgF>D6{I)aTqFiSP*(-`msS8+&5p9 zgyKfEHGrKwics=Ftg^p5Ss2T#6|vxZ!6{;(nd1-@Qct!M;daIV3{Fet3vw)G1jfX` zVuKkt$ER#dhS>gtk6xyc7B_tEb6xZ)UQ}BnfP5FS%e``;8w(i-3xP>jpJrcS6jx!V zWwl|@fgC)PS0&6cQg8$q+Ra}5fmx@oi5!p>hb&@x6DWtc*>ffJUv(Nf4 zSxxB9FlK^NQkHg+uwFPLj%yDXu#9eFTlT;ukeW_DMXm_3hAWAYe#Qm$U#QwzmVVrwD)+ zv2)9GnEx%LFcg>oXliL9)Sgh669=e3V%AAKpf&PVqTr%yz#~I#Q0Ml*TWbD-c0K=0 z%W8QL0i}oo-lins_0LM#kU}SynS7*A9d8-04Kck>*OGCBF5A5lg6iQf`p=hV+%^H* zL29|uJhHq^w_B{_|H0!E@z!_zhWL+a^hu?@oS1#HZ5Agul9YfU7d9>@58j6MR$wKa|$EhEl`0IBUx z1`1^-Px3Dgs8S&Md;#Ca%X}v=rT2m>m&ism7$uw(XHemN<|5AB#Av*P8_@8e;ZI{rvdE9L5jgl3SF@$w*Lm20X;aG z#N7;83Dw$AYQF##Tn3qgLkNS3>FHns4+)q==_$0St1BE6G)}o`IdmBu9s^t`rO3PN z4bFf}UpSp_(bSR-G!Ch?Q5FzJ+VqpM;Thi%qA0%yKT8Moi|)t`7gr`)P5%zCX-eg{ z&RMkwQ#}TiTQ6@&Ly0m#iExSdDo?g~QSDe?>%Ugui26@(`Wo+Xiq%;6v@0n)xJLr#Td{RxOaJAsdS81v@P zoI%VgqiT!2>i3*i696mFe9 { + const { + shell + } = require('electron') + await shell.openExternal('https://electronjs.org') + } + }] + } +] + +module.exports = getMenu; diff --git a/electron/package-lock.json b/electron/package-lock.json new file mode 100644 index 0000000000..3172b2375e --- /dev/null +++ b/electron/package-lock.json @@ -0,0 +1,5767 @@ +{ + "name": "Stratos", + "version": "4.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@electron-forge/async-ora": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/async-ora/-/async-ora-6.0.0-beta.54.tgz", + "integrity": "sha512-OCoHds0BIXaB54HgKw6pjlHC1cnaTcfJfVVkPSJl1GLC3VShZ5bETJfsitwbiP2kbfKLUQFayW27sqbwnwQR2w==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "debug": "^4.1.0", + "log-symbols": "^4.0.0", + "ora": "^5.0.0", + "pretty-ms": "^7.0.0" + }, + "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" + } + }, + "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 + } + } + }, + "@electron-forge/cli": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.0-beta.54.tgz", + "integrity": "sha512-+Ui1BI8c5CnBawH2OEySa5QR8DzrFd/I9FHlClvrTsIDfsBAeMSv9NTbSNcmo9Af5kI+aNsLQa8tp1vD8DNrng==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/core": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@electron/get": "^1.9.0", + "colors": "^1.4.0", + "commander": "^4.1.1", + "debug": "^4.1.0", + "fs-extra": "^9.0.1", + "inquirer": "^7.3.3", + "semver": "^7.2.1" + }, + "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" + } + }, + "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 + } + } + }, + "@electron-forge/core": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.0-beta.54.tgz", + "integrity": "sha512-yggZeiwRLnIsQYCT5jKhx2L7I02CwUCjnIzA+CqUZXD0AU1c2o0BA/26dNOGvY/+pr5yWjOXcrGy1hvj3dnLmQ==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/installer-base": "6.0.0-beta.54", + "@electron-forge/installer-deb": "6.0.0-beta.54", + "@electron-forge/installer-dmg": "6.0.0-beta.54", + "@electron-forge/installer-exe": "6.0.0-beta.54", + "@electron-forge/installer-rpm": "6.0.0-beta.54", + "@electron-forge/installer-zip": "6.0.0-beta.54", + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/plugin-base": "6.0.0-beta.54", + "@electron-forge/publisher-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@electron-forge/template-base": "6.0.0-beta.54", + "@electron-forge/template-typescript": "6.0.0-beta.54", + "@electron-forge/template-typescript-webpack": "6.0.0-beta.54", + "@electron-forge/template-webpack": "6.0.0-beta.54", + "@electron/get": "^1.9.0", + "@malept/cross-spawn-promise": "^1.1.0", + "colors": "^1.4.0", + "debug": "^4.1.0", + "electron-packager": "^15.0.0", + "electron-rebuild": "^2.0.3", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.5", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.0", + "nugget": "^2.0.1", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "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" + } + }, + "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 + } + } + }, + "@electron-forge/installer-base": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-base/-/installer-base-6.0.0-beta.54.tgz", + "integrity": "sha512-q6Z5kBAE6StKqn+3Z5tXVHu7WGCb9OMeIomw9H9Q41UUIehF7V0J3tCWTkJdhZ8D6/tkXcis3GKptaj0wfMpyg==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54" + } + }, + "@electron-forge/installer-darwin": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-darwin/-/installer-darwin-6.0.0-beta.54.tgz", + "integrity": "sha512-kRbH24+QBhbcIugnIvevnf43JGzLFLoyFsoY3YeyZeeDL3vfyg0vtSyUx0hfq1GpHG+zObDf3o18c3WbxdXlXA==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/installer-base": "6.0.0-beta.54", + "fs-extra": "^9.0.1", + "sudo-prompt": "^9.1.1" + } + }, + "@electron-forge/installer-deb": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-deb/-/installer-deb-6.0.0-beta.54.tgz", + "integrity": "sha512-UbJR2Md0SBqex5AIv9YZ56hY2Iz5gZ6f1iAx0q4PlYpCY19W9nRXdudLNhx1w5go26DsT53+h6EzX2NGpBLq3Q==", + "dev": true, + "requires": { + "@electron-forge/installer-linux": "6.0.0-beta.54" + } + }, + "@electron-forge/installer-dmg": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-dmg/-/installer-dmg-6.0.0-beta.54.tgz", + "integrity": "sha512-F9jwhUTzdFNlbLus7RQ8paoGPryr79JFYDLi42f0dyuFwlOjwlrA1wN5xWqrvcMeqFlc3DfjjeRWZ+10RQyorA==", + "dev": true, + "requires": { + "@electron-forge/installer-darwin": "6.0.0-beta.54", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.1.0", + "fs-extra": "^9.0.1" + }, + "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" + } + }, + "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 + } + } + }, + "@electron-forge/installer-exe": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-exe/-/installer-exe-6.0.0-beta.54.tgz", + "integrity": "sha512-PE7RBPerSenNcSkKXJWpervKNl7AVT+JeMzx61OHUQSw3h63NHRvXWh31llxk32mmJcaKRgGle2GsWob87Lv/w==", + "dev": true, + "requires": { + "@electron-forge/installer-base": "6.0.0-beta.54", + "open": "^7.2.1" + } + }, + "@electron-forge/installer-linux": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-linux/-/installer-linux-6.0.0-beta.54.tgz", + "integrity": "sha512-WQVV5fitsfTyktjb18m9Bx+Dho6rCFvVILqFNZAu1RfXIsjLl/h0WdkozdGDccfeDMqlRYmaNs3e5THn5swnAg==", + "dev": true, + "requires": { + "@electron-forge/installer-base": "6.0.0-beta.54", + "sudo-prompt": "^9.1.1" + } + }, + "@electron-forge/installer-rpm": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-rpm/-/installer-rpm-6.0.0-beta.54.tgz", + "integrity": "sha512-8gaJA2m8+Y/ZhV4xEeijXz8UksrliMEzyUAdwM5ZdAsmfmGlnhchGr0L6rI23D66dQP9DeyvUIuUwXrsTlj1nQ==", + "dev": true, + "requires": { + "@electron-forge/installer-linux": "6.0.0-beta.54" + } + }, + "@electron-forge/installer-zip": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-zip/-/installer-zip-6.0.0-beta.54.tgz", + "integrity": "sha512-KCY5zreA79wjZODhLmtrbFweTWdlh9JgmW9WruIrmHm3sK19rRhCdaZ+Dg5ZWUhMx2A79d5a2C7r78lWGcHl7A==", + "dev": true, + "requires": { + "@electron-forge/installer-darwin": "6.0.0-beta.54", + "@malept/cross-spawn-promise": "^1.1.0", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/maker-base": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.0-beta.54.tgz", + "integrity": "sha512-4y0y15ieb1EOR5mibtFM9tZzaShbAO0RZu6ARLCpD5BgKuJBzXRPfWvEmY6WeDNzoWTJ+mQdYikLAeOL2E9mew==", + "dev": true, + "requires": { + "@electron-forge/shared-types": "6.0.0-beta.54", + "fs-extra": "^9.0.1", + "which": "^2.0.2" + } + }, + "@electron-forge/maker-deb": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.0.0-beta.54.tgz", + "integrity": "sha512-PEAYULi7n/JkwvaEQnM554ewmLYkxGtHvuh6vUf5wsh48Xw3jcEVHejsc4FDjx5I6cKAByb9nscTtZpKt3ngXw==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "electron-installer-debian": "^3.0.0" + } + }, + "@electron-forge/maker-dmg": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-6.0.0-beta.54.tgz", + "integrity": "sha512-5FmzxBiBxTS7z9SthJKRWpOtMKeDrPqvdi3l56DhwAO6beV3g2Gx2bpx9Y8PZXCU+fLDmcTgUstzjxFF7LLggQ==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "electron-installer-dmg": "^3.0.0", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/maker-rpm": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.0.0-beta.54.tgz", + "integrity": "sha512-6nqBOUnojRE8+KdvE8zVXN2/H/V/QuWJQ4cwCLahJQxG1kG5RXOh6VbsM1mEFxjJwOhVnK+wkNCODf1qi56JZw==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "electron-installer-redhat": "^3.2.0" + } + }, + "@electron-forge/maker-squirrel": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.0-beta.54.tgz", + "integrity": "sha512-JJ+HmUe94zZ6mZnyv3IvNLQ5nwoj4dcQ4gzwps4P3fCEpuABMr74KOlza7fMXrrs8cwOrGfMFwsk80GTcLdWkg==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "electron-winstaller": "^4.0.1", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/maker-zip": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.0-beta.54.tgz", + "integrity": "sha512-wbJhK1rDOCZMTtKrjvavT8R+Yi+v/6axsnTXvzbkzzMQ0xADKNslTwzO6mmbBJea4oIbYmQ44DRAjI21TNyQ/A==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "cross-zip": "^3.0.0", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/plugin-base": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.0-beta.54.tgz", + "integrity": "sha512-8HwGzgNCHo2PgUfNnTch3Gvj7l6fqOgjnARK1y056UfsxFy+hwvHaAO+7LLfr7ktNwU/bH3hGhOpE+ZmBSwSqQ==", + "dev": true, + "requires": { + "@electron-forge/shared-types": "6.0.0-beta.54" + } + }, + "@electron-forge/publisher-base": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.0-beta.54.tgz", + "integrity": "sha512-Dny0jW0N8QcNYKHTtzQFZD4pBWJ7tclJWf3ZCX031vUKG7RhThdA06IPNzV6JtWJswrvAE9TPndzZONMza2V7g==", + "dev": true, + "requires": { + "@electron-forge/shared-types": "6.0.0-beta.54" + } + }, + "@electron-forge/publisher-github": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-6.0.0-beta.54.tgz", + "integrity": "sha512-B6jwlYBtLjxpL0K6X7DKr8RgOk7mFEDbPsnExmZBbdY19FJ6Z5IdW8atOOqVQl7i+8XjwtXGOKBFv2QDKHp48A==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/publisher-base": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@octokit/core": "^3.1.2", + "@octokit/rest": "^18.0.6", + "@octokit/types": "^5.5.0", + "fs-extra": "^9.0.1", + "lodash": "^4.17.20", + "mime-types": "^2.1.25" + } + }, + "@electron-forge/shared-types": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.0-beta.54.tgz", + "integrity": "sha512-6CzWKFR17rxxeIqm1w5ZyT9uTAHSVAjhqL8c+TmizF2703GyCEusUkjP2UXt/tZNY4MJlukZoJM66Bct6oZJ+w==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "electron-packager": "^15.0.0", + "electron-rebuild": "^2.0.3", + "ora": "^5.0.0" + } + }, + "@electron-forge/template-base": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.0-beta.54.tgz", + "integrity": "sha512-LuSpeOiM6AzUbamz5U/NqRkn4y7dzof1JK1ISAb+6tORf7JU014aKqDcLdwgP8Lxaz6P1bdlMmNJTvg5+SBrEw==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "debug": "^4.1.0", + "fs-extra": "^9.0.1", + "username": "^5.1.0" + }, + "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" + } + }, + "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 + } + } + }, + "@electron-forge/template-typescript": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript/-/template-typescript-6.0.0-beta.54.tgz", + "integrity": "sha512-7V87LWH+vJ1YibM9MsTttbz7upfwLrmXgchQ399EfLxK306g7q/ouyGkeTerhLr2gCUAvm/Oqx+sXQ7402ol9w==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@electron-forge/template-base": "6.0.0-beta.54", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/template-typescript-webpack": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript-webpack/-/template-typescript-webpack-6.0.0-beta.54.tgz", + "integrity": "sha512-1MIw1eGlMZg7KLG4oAEE0rB28WDOtz01OSoW2a2NqkmUzmu4BxJdSvQ97Tp7xCU0naW0H1uU39B9QOjJQgLGCQ==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@electron-forge/template-base": "6.0.0-beta.54", + "fs-extra": "^9.0.1" + } + }, + "@electron-forge/template-webpack": { + "version": "6.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.0-beta.54.tgz", + "integrity": "sha512-4/zUOZ8MCZqs8PcUCeeG6ofpy6HT53tQiLknM23OPaFP6ckuE6kOunC6N/teijUrJuLpKl3P8d39SWPVacxEzg==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.54", + "@electron-forge/shared-types": "6.0.0-beta.54", + "@electron-forge/template-base": "6.0.0-beta.54", + "fs-extra": "^9.0.1" + } + }, + "@electron/get": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", + "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "progress": "^2.0.3", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.1" + }, + "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" + } + }, + "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 + }, + "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 + } + } + }, + "@malept/cross-spawn-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz", + "integrity": "sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@octokit/auth-token": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz", + "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/core": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.2.2.tgz", + "integrity": "sha512-cZEP6dC8xpepbAqtdS1GgX88omLer8VQegw5BpQ5fbSrkxgY9Y9K7ratu8ezAd9bD0GVOR1GVWiRzYdxiprU1w==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.4.0", + "@octokit/types": "^6.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/endpoint": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz", + "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/graphql": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.8.tgz", + "integrity": "sha512-WnCtNXWOrupfPJgXe+vSmprZJUr0VIu14G58PMlkWGj3cH+KLZEfKMmbUQ6C3Wwx6fdhzVW1CD5RTnBdUHxhhA==", + "dev": true, + "requires": { + "@octokit/request": "^5.3.0", + "@octokit/types": "^6.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/openapi-types": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-1.2.2.tgz", + "integrity": "sha512-vrKDLd/Rq4IE16oT+jJkDBx0r29NFkdkU8GwqVSP4RajsAvP23CMGtFhVK0pedUhAiMvG1bGnFcTC/xCKaKgmw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.6.0.tgz", + "integrity": "sha512-o+O8c1PqsC5++BHXfMZabRRsBIVb34tXPWyQLyp2IXq5MmkxdipS7TXM4Y9ldL1PzY9CTrCsn/lzFFJGM3oRRA==", + "dev": true, + "requires": { + "@octokit/types": "^5.5.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", + "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.2.1.tgz", + "integrity": "sha512-QyFr4Bv807Pt1DXZOC5a7L5aFdrwz71UHTYoHVajYV5hsqffWm8FUl9+O7nxRu5PDMtB/IKrhFqTmdBTK5cx+A==", + "dev": true, + "requires": { + "@octokit/types": "^5.5.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.11.tgz", + "integrity": "sha512-vskebNjuz4oTdPIv+9cQjHvjk8vjrMv2fOmSo6zr7IIaFHeVsJlG/C07MXiSS/+g/qU1GHjkPG1XW3faz57EoQ==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^6.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "once": "^1.4.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/request-error": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz", + "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.0.1.tgz", + "integrity": "sha512-H/DnTKC+U09en2GFLH/MfAPNDaYb1isieD4Hx4NLpEt/I1PgtZP/8a+Ehc/j9GHuVF/UvGtOVD8AF9XXvws53w==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^1.2.0", + "@types/node": ">= 8" + } + } + } + }, + "@octokit/rest": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.9.tgz", + "integrity": "sha512-CC5+cIx974Ygx9lQNfUn7/oXDQ9kqGiKUC6j1A9bAVZZ7aoTF8K6yxu0pQhQrLBwSl92J6Z3iVDhGhGFgISCZg==", + "dev": true, + "requires": { + "@octokit/core": "^3.0.0", + "@octokit/plugin-paginate-rest": "^2.2.0", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "4.2.1" + } + }, + "@octokit/types": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", + "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/fs-extra": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.4.tgz", + "integrity": "sha512-50GO5ez44lxK5MDH90DYHFFfqxH7+fTqEEnvguQRzJ/tY9qFrMSHLiYHite+F3SNmf7+LHC1eMXojuD+E3Qcyg==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "optional": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@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, + "optional": true + }, + "@types/node": { + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "appdmg": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.0.tgz", + "integrity": "sha512-vDz8cMf5c6BfoS72OmmHzzuxG5DFVDM6YCAkscjYh3GASGEBBRCZ10Bn515ZPSPHOpfI9Xu3MlApbd49C58pJg==", + "dev": true, + "optional": true, + "requires": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "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 + }, + "asar": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", + "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base32-encode": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.1.1.tgz", + "integrity": "sha512-eqa0BeGghj3guezlasdHJhr3+J5ZbbQvxeprkcDMbRQrjlqOT832IUDT4Al4ofAwekFYMqkkM9KMUHs9Cu0HKA==", + "dev": true, + "optional": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolean": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", + "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", + "dev": true, + "optional": true + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "optional": true, + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "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-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "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", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cacheable-lookup": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", + "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==", + "dev": true + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "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=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "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 + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "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 + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-js": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.0.tgz", + "integrity": "sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA==", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cross-zip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-3.1.0.tgz", + "integrity": "sha512-aX02l0SD3KE27pMl69gkxDdDM5D3u9Ic4Je+2b1B2fP0dWnlWWY6ns2Vk5DEgCXJRhL3GasSpicNQRNbDkq0+w==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true, + "optional": 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=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "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" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "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, + "optional": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true, + "optional": true + }, + "ds-store": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", + "integrity": "sha1-0QJO90btDBPw9/7IXH6FjoxLfKc=", + "dev": true, + "optional": true, + "requires": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-11.0.3.tgz", + "integrity": "sha512-nNfbLi7Q1xfJXOEO2adck5TS6asY4Jxc332E4Te8XfQ9hcaC3GiCdeEqk9FndNCwxhJA5Lr9jfSGRTwWebFa/w==", + "dev": true, + "requires": { + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", + "extract-zip": "^1.0.3" + }, + "dependencies": { + "@types/node": { + "version": "12.19.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.8.tgz", + "integrity": "sha512-D4k2kNi0URNBxIRCb1khTnkWNHv8KSL1owPmS/K5e5t8B2GzMReY7AsJIY1BnP5KdlgC4rj9jk2IkDMasIE7xg==", + "dev": true + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + } + } + }, + "electron-context-menu": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-2.0.1.tgz", + "integrity": "sha512-klE6+PErH/l9IzoIm9PCcOaKvRtCuyjG8IYKcT376cEBhQwYtp3RsVKvLZ5jLhSLY0+rwgEl0LprBcW3NhM0+w==", + "requires": { + "cli-truncate": "^2.0.0", + "electron-dl": "^3.0.0", + "electron-is-dev": "^1.0.1" + } + }, + "electron-dl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-3.0.0.tgz", + "integrity": "sha512-TeBRv+vQgNVLGf/XLV4EYfYIBMI4TQcw84aDlM8xEm/1Lgxux3PUXDzaingivf+6jMvRojXSRPTHmiWI/6LrqQ==", + "requires": { + "ext-name": "^5.0.0", + "pupa": "^2.0.1", + "unused-filename": "^2.1.0" + } + }, + "electron-installer-common": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", + "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", + "dev": true, + "optional": true, + "requires": { + "@malept/cross-spawn-promise": "^1.0.0", + "@types/fs-extra": "^9.0.1", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "electron-installer-debian": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz", + "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==", + "dev": true, + "optional": true, + "requires": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^15.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, + "optional": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "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, + "optional": 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, + "optional": true, + "requires": { + "p-locate": "^4.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, + "optional": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "optional": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "optional": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-installer-dmg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-3.0.0.tgz", + "integrity": "sha512-a3z9ABUfLJtrLK1ize4j+wJKslodb0kRHgBuUN4GTckiUxtGdo49XCvvAHvQaOqQk3S5VTvuc6PoofnI9mKSCQ==", + "dev": true, + "optional": true, + "requires": { + "appdmg": "^0.6.0", + "debug": "^4.1.1", + "fs-extra": "^8.0.1", + "minimist": "^1.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": true + }, + "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, + "optional": true + } + } + }, + "electron-installer-redhat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.2.0.tgz", + "integrity": "sha512-XMA+fQj3ULNVMl4eG+hIvrYITEqP1pfpERvx6kRwuPd06vdtB4KucL9241DAHT0NR5E9gnyJHM9Y6N24kk0mcA==", + "dev": true, + "optional": true, + "requires": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^15.1.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, + "optional": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "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, + "optional": 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, + "optional": true, + "requires": { + "p-locate": "^4.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, + "optional": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "optional": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "optional": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-is-dev": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==" + }, + "electron-log": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.3.0.tgz", + "integrity": "sha512-iuJjH/ZEJkDyCbuAMvvFxAjCMDLMXIQ5NqvppETGrbtf4b/007r5P36BSvexdy0UzwDNzDtIuEXLR34vRXWZrg==" + }, + "electron-notarize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.0.0.tgz", + "integrity": "sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "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" + } + }, + "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 + } + } + }, + "electron-osx-sign": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", + "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + } + }, + "electron-packager": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-15.1.0.tgz", + "integrity": "sha512-THNm4bz1DfvR9f0g51+NjuAYELflM8+1vhQ/iv/G8vyZNKzSMuFd5doobngQKq3rRsLdPNZVnGqDdgS884d7Og==", + "dev": true, + "requires": { + "@electron/get": "^1.6.0", + "asar": "^3.0.0", + "debug": "^4.0.1", + "electron-notarize": "^1.0.0", + "electron-osx-sign": "^0.4.11", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^9.0.0", + "galactus": "^0.2.1", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^2.0.0", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^19.0.1" + }, + "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" + } + }, + "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 + } + } + }, + "electron-rebuild": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-2.3.2.tgz", + "integrity": "sha512-VLd3iIn65PmYWmvL+nx0oKspbohkDUhCAz8I2EWbMJcOFzWKW1UXJZ+ZG53iEDJFldm9PahE4q2Bx3ns4bdzeQ==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^1.1.0", + "colors": "^1.3.3", + "debug": "^4.1.1", + "detect-libc": "^1.0.3", + "fs-extra": "^9.0.1", + "got": "^11.7.0", + "lzma-native": "^6.0.1", + "node-abi": "^2.19.1", + "node-gyp": "^7.1.0", + "ora": "^5.1.0", + "tar": "^6.0.5", + "yargs": "^16.0.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^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" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz", + "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "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-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + } + } + }, + "electron-squirrel-startup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz", + "integrity": "sha1-GbTlWTP6Dvj1VnhLnGYPdyVGoLg=", + "requires": { + "debug": "^2.2.0" + } + }, + "electron-window-state": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", + "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", + "requires": { + "jsonfile": "^4.0.0", + "mkdirp": "^0.5.1" + } + }, + "electron-winstaller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-4.0.1.tgz", + "integrity": "sha512-wgdABzcMFpREjFCHZKQ5g5JF5jGqa8YCAsVD5Tb3sJhdj63AtuCu/2o++nVESlZZugKDv6Hxo6Wi8c3knEkbgA==", + "dev": true, + "optional": true, + "requires": { + "asar": "^2.0.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash.template": "^4.2.2", + "temp": "^0.9.0" + }, + "dependencies": { + "asar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "dev": true, + "optional": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^2.20.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "tmp-promise": "^1.0.5" + } + }, + "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 + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "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==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "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, + "optional": true + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "tmp-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", + "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", + "dev": true, + "optional": true, + "requires": { + "bluebird": "^3.5.0", + "tmp": "0.1.0" + } + }, + "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, + "optional": 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==" + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "optional": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "optional": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "optional": true + }, + "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" + }, + "dependencies": { + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "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" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "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" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.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 + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "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 + }, + "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 + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.2.0.tgz", + "integrity": "sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "flora-colossus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", + "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^7.0.0" + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + } + } + }, + "fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", + "dev": true, + "optional": true, + "requires": { + "imul": "^1.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "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==" + } + } + } + } + }, + "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": { + "minipass": "^2.6.0" + } + }, + "fs-temp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", + "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", + "dev": true, + "optional": true, + "requires": { + "random-path": "^0.1.0" + } + }, + "fs-xattr": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", + "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", + "dev": true, + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "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 + }, + "galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + }, + "dependencies": { + "debug": { + "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" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "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 + }, + "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 + } + } + }, + "gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "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" + } + } + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.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 + }, + "get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "optional": true, + "requires": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + } + }, + "get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "requires": { + "global-modules": "1.0.0" + } + }, + "get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", + "dev": true, + "requires": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-url-to-object": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-4.0.4.tgz", + "integrity": "sha512-1Ri1pR8XTfzLpbtPz5MlW/amGNdNReuExPsbF9rxLsBfO1GH9RtDBamhJikd0knMWq3RTTQDbTtw0GGvvEAJEA==", + "requires": { + "is-url": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-agent": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", + "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.1", + "core-js": "^3.6.5", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "dev": true, + "optional": true, + "requires": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + } + }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^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==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "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.12.3", + "har-schema": "^2.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 + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "dev": true, + "optional": true + }, + "imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", + "dev": true, + "optional": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "inquirer": { + "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": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.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-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.20.5", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz", + "integrity": "sha512-VTPuvvGQtxvCeghwspQu1rBgjYUT6FGxPlvFKbYuFtgc4ADsX3U5ihZOYN0qyU6u+d4X9xXb0IT5O6QpXKt87A==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "optional": true + } + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "optional": true + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonpointer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", + "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "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 + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true, + "optional": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lzma-native": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-6.0.1.tgz", + "integrity": "sha512-O6oWF0xe1AFvOCjU8uOZBZ/lhjaMNwHfVNaqVMqmoQXlRwBcFWpCAToiZOdXcKVMdo/5s/D0a2QgA5laMErxHQ==", + "dev": true, + "requires": { + "node-addon-api": "^1.6.0", + "node-pre-gyp": "^0.11.0", + "readable-stream": "^2.3.5", + "rimraf": "^2.7.1" + } + }, + "macos-alias": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", + "integrity": "sha1-/u6mwTuhGYFKQ/xDxHCzHlnvcYo=", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.4.0" + } + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^4.0.0" + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "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==", + "requires": { + "minimist": "^1.2.5" + } + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "murmur-32": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", + "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", + "dev": true, + "optional": true, + "requires": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "dev": 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, + "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 + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-abi": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz", + "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==", + "dev": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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" + } + } + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tar": { + "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.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" + } + } + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-packlist": { + "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": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "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=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "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, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "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" + } + }, + "ora": { + "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": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "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 + }, + "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-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "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-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "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": "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-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "requires": { + "author-regex": "^1.0.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "optional": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true, + "optional": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": 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": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + } + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "requires": { + "parse-ms": "^2.1.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "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 + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "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" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "random-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", + "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", + "dev": true, + "optional": true, + "requires": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "rcedit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.2.0.tgz", + "integrity": "sha512-dhFtYmQS+V8qQIANyX6zDK+sO50ayDePKApi46ZPK8I6QeyyTDD6LManMa7a3p3c9mLM4zi9QBP41pfhQ9p7Sg==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^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=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "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" + } + }, + "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==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "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" + } + }, + "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, + "optional": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "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, + "optional": 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" + } + }, + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", + "dev": true + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha1-aG9wsYi9fWdfW7xCgszaBgq7nSc=", + "dev": true, + "requires": { + "get-installed-path": "^2.0.3" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "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": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "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" + } + }, + "roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "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" + } + }, + "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 + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.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 + }, + "semver": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true, + "optional": true + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "requires": { + "type-fest": "^0.13.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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 + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "^1.0.1" + }, + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "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" + } + } + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "requires": { + "sort-keys": "^1.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" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "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, + "optional": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true, + "optional": 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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^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==", + "dev": true, + "requires": { + "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==", + "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 + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true + }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "requires": { + "debug": "^4.1.0" + }, + "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" + } + }, + "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 + } + } + }, + "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" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "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" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "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": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=", + "dev": true, + "optional": true + }, + "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" + } + }, + "tmp-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.2.tgz", + "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", + "dev": true, + "optional": true, + "requires": { + "tmp": "^0.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "tn1150": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", + "integrity": "sha1-ZzUD0k1WuH3ouMd/7j/AhT1ZoY0=", + "dev": true, + "optional": true, + "requires": { + "unorm": "^1.4.1" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.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 + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "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, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "optional": true + }, + "unused-filename": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-2.1.0.tgz", + "integrity": "sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg==", + "requires": { + "modify-filename": "^1.1.0", + "path-exists": "^4.0.0" + } + }, + "update-electron-app": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/update-electron-app/-/update-electron-app-1.5.0.tgz", + "integrity": "sha512-g7noW9JfQ8Hwq6zw9lmZei+R/ikOIBcaZ04TbmIcU5zNfv23HkN80QLLAyiR/47KvfS4sjnh2/wuDq5nh8+0mQ==", + "requires": { + "electron-is-dev": "^0.3.0", + "github-url-to-object": "^4.0.4", + "is-url": "^1.2.4", + "ms": "^2.1.1" + }, + "dependencies": { + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "mem": "^4.3.0" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "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 + }, + "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" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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, + "optional": 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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + } + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz", + "integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==", + "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" + }, + "dependencies": { + "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 + } + } + }, + "yargs-parser": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-19.0.4.tgz", + "integrity": "sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw==", + "dev": true + }, + "yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "dependencies": { + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "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" + } + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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/electron/package.json b/electron/package.json new file mode 100644 index 0000000000..55bc0bf085 --- /dev/null +++ b/electron/package.json @@ -0,0 +1,85 @@ +{ + "name": "Stratos", + "version": "4.0.0", + "main": "index.js", + "scripts": { + "ng": "ng", + "start": "electron-forge start", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "electron": "./node_modules/.bin/electron .", + "package": "electron-forge package", + "make": "electron-forge make", + "epublish": "electron-forge publish" + }, + "dependencies": { + "chokidar": "^3.4.1", + "electron-context-menu": "^2.0.1", + "electron-log": "^4.2.2", + "electron-squirrel-startup": "^1.0.0", + "electron-window-state": "^5.0.3", + "fs-extra": "^9.0.1", + "update-electron-app": "^1.5.0" + }, + "devDependencies": { + "@electron-forge/cli": "^6.0.0-beta.52", + "@electron-forge/maker-deb": "^6.0.0-beta.52", + "@electron-forge/maker-dmg": "^6.0.0-beta.52", + "@electron-forge/maker-rpm": "^6.0.0-beta.52", + "@electron-forge/maker-squirrel": "^6.0.0-beta.52", + "@electron-forge/maker-zip": "^6.0.0-beta.52", + "@electron-forge/publisher-github": "^6.0.0-beta.52", + "electron": "^11.0.3" + }, + "config": { + "forge": { + "packagerConfig": { + "dir": ".", + "icon": "./icon.icns" + }, + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "config": { + "name": "Stratos" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": [ + "darwin" + ] + }, + { + "name": "@electron-forge/maker-deb", + "config": {} + }, + { + "name": "@electron-forge/maker-rpm", + "config": {} + }, + { + "name": "@electron-forge/maker-dmg", + "config": { + "background": "background.png", + "icon": "VolumeIcon.icns" + } + } + ], + "publishers": [ + { + "name": "@electron-forge/publisher-github", + "config": { + "repository": { + "owner": "nwmac", + "name": "stratos-desktop" + }, + "prerelease": false + } + } + ] + } + } +} diff --git a/electron/package.sh b/electron/package.sh new file mode 100755 index 0000000000..54daf1d880 --- /dev/null +++ b/electron/package.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Script folder +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +STRATOS="`cd "${DIR}/..";pwd`" + +source "${DIR}/build.sh" + +pushd ${DIR} > /dev/null +rm -rf dist/*es5* +popd > /dev/null + +npm run package + +# Mac - move the app to the Applications folder +if [ "$1" == "-i" ]; then + mv ./out/Stratos-darwin-x64/Stratos.app /Applications +fi \ No newline at end of file diff --git a/electron/prep-backend.sh b/electron/prep-backend.sh new file mode 100755 index 0000000000..0ba0988811 --- /dev/null +++ b/electron/prep-backend.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# Script folder +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +STRATOS="`cd "${DIR}/..";pwd`" + +pushd ${STRATOS} > /dev/null +# Ensure we include the desktop backend plugin +STRATOS_YAML=./electron/stratos.yaml npm run prepare-backend +popd > /dev/null \ No newline at end of file diff --git a/electron/run.sh b/electron/run.sh new file mode 100755 index 0000000000..fd437c12a9 --- /dev/null +++ b/electron/run.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# Script folder +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +STRATOS="`cd "${DIR}/..";pwd`" + +source "${DIR}/build.sh" + +echo "Running electron app ...." +npm run electron -- ${ARGS} \ No newline at end of file diff --git a/electron/stratos.yaml b/electron/stratos.yaml new file mode 100644 index 0000000000..e7f5f517ca --- /dev/null +++ b/electron/stratos.yaml @@ -0,0 +1,2 @@ +packages: + desktop: true diff --git a/package-lock.json b/package-lock.json index dbc2a7bb7a..1578216fce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,154 +1,388 @@ { "name": "stratos", - "version": "4.3.0", + "version": "4.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-builders/custom-webpack": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-9.2.0.tgz", - "integrity": "sha512-0ivkjENONFm0oNy6hdCod4YaT4dUk80KuP9+eDliWuZIA70yKQgIYMLul0bz6/i+Cm24PaZ2tq4w7kW7AuSMoA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-10.0.1.tgz", + "integrity": "sha512-YDy5zEKVwXdoXLjmbsY6kGaEbmunQxaPipxrwLUc9hIjRLU2WcrX9vopf1R9Pgj4POad73IPBNGu+ibqNRFIEQ==", "dev": true, "requires": { - "@angular-devkit/architect": ">=0.900.0 < 0.1000.0", - "@angular-devkit/build-angular": ">=0.900.0 < 0.1000.0", - "@angular-devkit/core": "^9.0.0", - "lodash": "^4.17.10", - "ts-node": "^8.5.2", - "webpack-merge": "^4.2.1" + "@angular-devkit/architect": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/build-angular": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/core": "^10.0.0", + "lodash": "^4.17.15", + "ts-node": "^9.0.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + } } }, "@angular-devkit/architect": { - "version": "0.901.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.7.tgz", - "integrity": "sha512-yW/PUEqle55QihOFbmeNXaVTodhfeXkteoFDUpz+YpX3xiQDXDtNbIJSzKOQTojtBKdSMKMvZkQLr+RAa7/1EA==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.7", - "rxjs": "6.5.4" + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "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.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.12.tgz", - "integrity": "sha512-enK+u1Lg1a/KWUs3r8Tc7Igduu5ph9fgziV8bjQeVrswrqFb0m0eEhxe/zV8rvE92H3NBZp5Z+uzOYIcg4eirw==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.901.12", - "@angular-devkit/build-optimizer": "0.901.12", - "@angular-devkit/build-webpack": "0.901.12", - "@angular-devkit/core": "9.1.12", - "@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.12", - "ajv": "6.12.3", - "autoprefixer": "9.7.4", - "babel-loader": "8.0.6", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1002.0.tgz", + "integrity": "sha512-cPkdp1GceokGHc79Wg0hACMqqmnJ4W3H9kY4c9qp1Xz18b3vk1aq09JNawOpfUN09S9vBCnn4glg22lRyqmJNA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/build-optimizer": "0.1002.0", + "@angular-devkit/build-webpack": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@babel/core": "7.11.1", + "@babel/generator": "7.11.0", + "@babel/plugin-transform-runtime": "7.11.0", + "@babel/preset-env": "7.11.0", + "@babel/runtime": "7.11.2", + "@babel/template": "7.10.4", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "10.2.0", + "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": "6.0.3", "core-js": "3.6.4", - "css-loader": "3.5.1", + "css-loader": "4.2.2", "cssnano": "4.1.10", "file-loader": "6.0.0", "find-cache-dir": "3.3.1", "glob": "7.1.6", - "jest-worker": "25.1.0", + "jest-worker": "26.3.0", "karma-source-map-support": "1.4.0", - "less": "3.11.3", - "less-loader": "5.0.0", - "license-webpack-plugin": "2.1.4", + "less-loader": "6.2.0", + "license-webpack-plugin": "2.3.0", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "0.9.0", + "mini-css-extract-plugin": "0.10.0", "minimatch": "3.0.4", - "open": "7.0.3", - "parse5": "4.0.0", - "postcss": "7.0.27", + "open": "7.2.0", + "parse5": "6.0.1", + "parse5-htmlparser2-tree-adapter": "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", + "raw-loader": "4.0.1", + "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.26.5", + "rxjs": "6.6.2", + "sass": "1.26.10", + "sass-loader": "10.0.1", + "semver": "7.3.2", "source-map": "0.7.3", - "source-map-loader": "0.2.4", - "speed-measure-webpack-plugin": "1.3.1", - "style-loader": "1.1.3", - "stylus": "0.54.7", + "source-map-loader": "1.0.2", + "source-map-support": "0.5.19", + "speed-measure-webpack-plugin": "1.3.3", + "style-loader": "1.2.1", + "stylus": "0.54.8", "stylus-loader": "3.0.2", - "terser": "4.6.10", - "terser-webpack-plugin": "3.0.3", + "terser": "5.3.0", + "terser-webpack-plugin": "4.1.0", "tree-kill": "1.2.2", - "webpack": "4.42.0", + "webpack": "4.44.1", "webpack-dev-middleware": "3.7.2", "webpack-dev-server": "3.11.0", "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.4.0", - "worker-plugin": "4.0.3" + "webpack-subresource-integrity": "1.4.1", + "worker-plugin": "5.0.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.12.tgz", - "integrity": "sha512-gLlsxa+3JPV1m1gRvRMujOs4xKox6I5BkYmOD1zfu+dB6y3LuBAvHfXA6FaTDVOMBrmSlWnE4PmOmB6xd7wxMA==", + "@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": { - "@angular-devkit/core": "9.1.12", - "rxjs": "6.5.4" + "@babel/highlight": "^7.10.4" } }, - "@angular-devkit/core": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz", - "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==", + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", "dev": true, "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.4", - "source-map": "0.7.3" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "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 + } } }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "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.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "@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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@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" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@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" + } + }, + "@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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, + "@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.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "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.12.1", + "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.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, "copy-webpack-plugin": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", @@ -166,33 +400,6 @@ "schema-utils": "^2.7.0", "serialize-javascript": "^4.0.0", "webpack-sources": "^1.4.3" - }, - "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - } } }, "core-js": { @@ -202,12 +409,12 @@ "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.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.0.0" + "ms": "2.1.2" } }, "fast-glob": { @@ -224,66 +431,18 @@ "picomatch": "^2.2.1" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "less": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", - "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", - "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", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0", - "tslib": "^1.10.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, - "optional": true - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass": { - "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" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "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 + }, "p-limit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", @@ -293,27 +452,31 @@ "p-try": "^2.0.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.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 + } } }, - "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 - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -324,18 +487,27 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, + "sass": { + "version": "1.26.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", + "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, "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 }, "serialize-javascript": { @@ -354,30 +526,36 @@ "dev": true }, "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": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "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": { - "minimist": "^1.2.5" + "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 + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -385,40 +563,52 @@ "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 } } }, "@angular-devkit/build-ng-packagr": { - "version": "0.901.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.7.tgz", - "integrity": "sha512-HJ6nzXIUyI8yUuXGtdk26qDgLzlmfSwsSuc8JWdeqieP82fz/qokf78vVAqyHyJ9gi90IZiPO2+oh6Ot6UMo+g==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1002.0.tgz", + "integrity": "sha512-JngcuLuPpu2oOhi1qBPzco+ETjDbv90zyWZELO3qXeCelug1z83E0Qi2sLgnNYayzSHfrivrRamL8CbYYT+M9Q==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.7", - "rxjs": "6.5.4" + "@angular-devkit/architect": "0.1002.0", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "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-optimizer": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.12.tgz", - "integrity": "sha512-XuXA+6y9QkIAwSVZhWmne4r7qugUUWaXobgRefbn9heiRlY8/7XkZmmvbSrxc1fgQfQar52W9fAa19fAIeNvnw==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1002.0.tgz", + "integrity": "sha512-ACnm9doPMbRtSy1UZN5ir7smeLMx0g0oW7jX3jyPepeQKZ+9U1Bn09t10NLZQH+Z509jWZgvNJH/aOh85P6euw==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "1.11.1", - "typescript": "3.6.5", + "tslib": "2.0.1", + "typescript": "4.0.2", "webpack-sources": "1.4.3" }, "dependencies": { @@ -428,94 +618,77 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "dev": true + }, "typescript": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.5.tgz", - "integrity": "sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.12.tgz", - "integrity": "sha512-zrhZV2LhQ4uFl9at9i2jiedIu932HsaFN4OMMsTFlV+6CZxtEUBI85hhnPa5KQtIYQr2OMQSQf/FyhnBGs0riQ==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1002.0.tgz", + "integrity": "sha512-TLBBQ6ANOLKXOPxpCOnxAtoknwHA7XhsLuueN06w5qqF+QNNbWUMPoieKFGs2TnotfCgbiq6x57IDEZTyT6V0w==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.12", - "@angular-devkit/core": "9.1.12", - "rxjs": "6.5.4" + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.12.tgz", - "integrity": "sha512-gLlsxa+3JPV1m1gRvRMujOs4xKox6I5BkYmOD1zfu+dB6y3LuBAvHfXA6FaTDVOMBrmSlWnE4PmOmB6xd7wxMA==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.12", - "rxjs": "6.5.4" - } - }, - "@angular-devkit/core": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz", - "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.4", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "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" - } - }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "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": "9.1.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz", - "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", "dev": true, "requires": { - "ajv": "6.12.0", + "ajv": "6.12.4", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.5.4", + "rxjs": "6.6.2", "source-map": "0.7.3" }, "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "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" + } + }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -526,72 +699,109 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "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 } } }, "@angular-devkit/schematics": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.7.tgz", - "integrity": "sha512-oeHPJePBcPp/bd94jHQeFUnft93PGF5iJiKV9szxqS8WWC5OMZ5eK7icRY0PwvLyfenspAZxdZcNaqJqPMul5A==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", + "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.7", - "ora": "4.0.3", - "rxjs": "6.5.4" + "@angular-devkit/core": "10.2.0", + "ora": "5.0.0", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "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": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.9.tgz", - "integrity": "sha512-qWVi0TxmU6HeXAgEsfpQvFFygh+a0kH2kGe6bWij4XvG6dWfV3xZjlaFwSIYGk+yK4yL0+9+PAXH+ENfxNw+Cw==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.0.tgz", + "integrity": "sha512-lKjC2Jm2Al4GCW2zKutdskMWqe5S23gknPvp65ybmR5D1Pz/YgzDOHXmTHqDn5qXJgzpFt/fJgNi805XrAOm4g==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/cdk": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.4.tgz", - "integrity": "sha512-iw2+qHMXHYVC6K/fttHeNHIieSKiTEodVutZoOEcBu9rmRTGbLB26V/CRsfIRmA1RBk+uFYWc6UQZnMC3RdnJQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.5.tgz", + "integrity": "sha512-SI/YdaxfkttG92A0uGRixyJkfTKHn0GIU+7BCSRq0d31ru3Ugfln+jr+5/xttxWr88CNPTfpGaUt0ZuSqYCzqw==", "requires": { - "parse5": "^5.0.0" + "parse5": "^5.0.0", + "tslib": "^2.0.0" } }, "@angular/cli": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.7.tgz", - "integrity": "sha512-NhsIa725S/U/n7nDxp6ForusdYHEXF4aSIvsFRdoK6vbQ889c5e1Rdj+T5EWXLmpQZxeprSKhLI2alNX0nVhhQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz", + "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.7", - "@angular-devkit/core": "9.1.7", - "@angular-devkit/schematics": "9.1.7", - "@schematics/angular": "9.1.7", - "@schematics/update": "0.901.7", + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "@schematics/angular": "10.2.0", + "@schematics/update": "0.1002.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "7.1.0", + "inquirer": "7.3.3", "npm-package-arg": "8.0.1", - "npm-pick-manifest": "6.0.0", - "open": "7.0.3", + "npm-pick-manifest": "6.1.0", + "open": "7.2.0", "pacote": "9.5.12", "read-package-tree": "5.3.1", "rimraf": "3.0.2", - "semver": "7.1.3", + "semver": "7.3.2", "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "7.0.2" + "universal-analytics": "0.4.23", + "uuid": "8.3.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" + } + }, + "@schematics/angular": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz", + "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "jsonc-parser": "2.3.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -607,12 +817,28 @@ "ms": "^2.1.1" } }, + "jsonc-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz", + "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==", + "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 }, + "open": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -622,34 +848,55 @@ "glob": "^7.1.3" } }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "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 + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", "dev": true } } }, "@angular/common": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.9.tgz", - "integrity": "sha512-y/tJtkuOJhV2kcaXZyrLZH84i4uQ1r+vaaEHvXj+JZYfYfcMMd/TDqMiPcIkUb3RxqghtZ+q0ZNW5D1Nlru3Pw==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.0.tgz", + "integrity": "sha512-4q7cb6Z18R1nQ8dN8uj6cckuk4jzY40lF7kpxf/wja0pQBUBtWwExwXsdHTVWGZ/mgQv9a5dTAPQq8/tSmf+hw==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/compiler": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.9.tgz", - "integrity": "sha512-kjFgaTB2ckr9lgmkS1dOGRT7kmzpQueydxsxXSHWgICNVE6F/u1PHyeSOyJRpxW0GnrkLq3QM2EUFnQGGga5bg==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.0.tgz", + "integrity": "sha512-r+zNEDJmfH7pyQULgs6iQgMv/zH/CokepTuemrVbBKkUjd8F9Q84XdflR2Tx2rukiAAl4B0BuG+v4tSb9pR1WQ==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/compiler-cli": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.9.tgz", - "integrity": "sha512-aLr2eaDlREN8XybgTbelvjtSZ8eAkxBPilnkddc700BgiC6ImyUSKaItOwa8bnjQwq4Wlz5eVG0ibsrX+5MXwg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.0.tgz", + "integrity": "sha512-NWTNg15LLL14MgooXV1Xb4w49I4OAfWakcc0J7XQm3B3mRFuue/UfXE9dKMStenTfmtUnNO9c+xjZRhTWYJkfw==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -663,6 +910,7 @@ "semver": "^6.3.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", "yargs": "15.3.0" }, "dependencies": { @@ -673,12 +921,11 @@ "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" } }, @@ -744,15 +991,6 @@ "p-locate": "^4.1.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -762,12 +1000,6 @@ "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -806,12 +1038,6 @@ "ansi-regex": "^5.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 - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -855,59 +1081,84 @@ } }, "@angular/core": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.9.tgz", - "integrity": "sha512-q/DERgVU6vK2LtTcdVCGGBcoO424WsEfImh3Vcuy+P/ZVmthlDUC/+q+tSKt8MMf4hLpxFDQJE8vUSkktj7QEw==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.0.tgz", + "integrity": "sha512-pj+0cIDHMfeTFFrxbxM1qanSqhnA3ybCYMQm+Fs/WAPlLSvB6s/vVhq6tCdicHzd7/fujGXPcb8Hvtx+km8TqQ==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/flex-layout": { - "version": "9.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.31.tgz", - "integrity": "sha512-g94u2mecDl87ORvFRuOBshV/S/ETE4bybClU2e1xXKWNG+rhRHchChneHSonc29ZLyROTjHhmAtKOYojL92uLA==" + "version": "10.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-10.0.0-beta.32.tgz", + "integrity": "sha512-JvuY4dUoy5jyCTIrFiq7n30Znakh1pD3nbg0h0hs2r3t1OiDQb0ZSI1wcumosG/vYHsuJQTuNhbfaIZzA1x8nA==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/forms": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.9.tgz", - "integrity": "sha512-r675yImnb/0pY7K5W3V2ITa7YETu1I2AS+bRfII6UQ6gthyeFFOHb5noa7YneC2yqQiM6E4DQmF5ig3daPuFNg==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.0.tgz", + "integrity": "sha512-pRQP5AWyB37rJWtgvZRWA3H+EMcP9M7QybOAfCf7z9CMRhKK+jVvd5yQqyqOYWOEBuS0kUD3HM/vrpZywhK/6g==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/language-service": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.9.tgz", - "integrity": "sha512-yT6HPpdAe2mD9HRoTCiWFog1MRJt+0j+CLbI/Ql7C6pH6vbjmfsJ55xMmQ7eS6trsnebpMWTUv1f2GRykv3ygw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.0.tgz", + "integrity": "sha512-p2yJ8QhJPrNAoeGJ2abX22rNMDyQAmGsMV0GUCpGfmrJ4wDLPW+hy7tbL44qGn2B4KY5lvj30yIxjxL8HtBCVw==", "dev": true }, "@angular/material": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.4.tgz", - "integrity": "sha512-LkoTXE6B0slvMhvfZDdPWaz4yaYLkaAp5VSPunI9pxGsPxzqEV9e210wC1/sjG/76Nk8Ep7/2z9XKac8Q9bMwA==" + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.2.5.tgz", + "integrity": "sha512-gYFqpXdLLuRYb9N1jVj9Gig/AlqsEfT/m+RtzHm4mawmHqeQbEV+0C0Qvc6fKRb1060Nkzfz8TDNGu5B+Xzq5A==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/material-moment-adapter": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-9.2.4.tgz", - "integrity": "sha512-V5xkL+YUec3nDGRaJB72mJTUtdUvGaG9WCQEdr45viDWFGjQaEpS6msuScBLp0PwsN8Wt0n69eZg0ULgxPBa5g==" + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-10.2.5.tgz", + "integrity": "sha512-2nIYwG5Xfd2XTaag8ZZKc7zUKHeh3xkFZA/+iCEDA+i0kuS+6OUUj5+wBxsl8TWC6joxoWdKMrReXjfJOlwD0A==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/platform-browser": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.9.tgz", - "integrity": "sha512-V861X3MxJp1AlMTnkUPldpBLIJbApXF3ka0A5Dq2nVJCyOFeteGkaRWSBgqe2jxmq+LVpJbzcNvtDFXw6mQ0jA==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.0.tgz", + "integrity": "sha512-GqO4MH7sddzvirr6AwxPXIfFFQp1+Xs5BCguSajyqt7i1j7vA0mKvFCvO7tIYmJmepWa0YPs9cXtq8nxDAoqVA==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/platform-browser-dynamic": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.9.tgz", - "integrity": "sha512-b9MG5MWne+IuL3uLm8jwPhlJzqYaGBGk/qibOqb17T24j1iyrlO7T5bZ8zO6pUy5iT/TahVfHPnPJC1qTK5OmA==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.0.tgz", + "integrity": "sha512-S1yBpoJjQcGrvkoHhy+We1lMi/TONzSAUTYz05WexDC6N8eLX4NpbjOUHxtYH5JfXltQ2B32zycyjwyB2t2ulA==", + "requires": { + "tslib": "^2.0.0" + } }, "@angular/platform-server": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.9.tgz", - "integrity": "sha512-PtOUE6Vxnrg03/zJbjnZ6BbctAEdFjAbHr8zbGhHa2q504DlY9OJACRCqcP8tIpW9nbDDKqvr/RENONmISichA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-10.2.0.tgz", + "integrity": "sha512-eIc7xiGPylQ6uExx+LeTOHFRDtsbRe4sqgbjsfmlQfvxuVbYRzacXctvymjqr1cGzYW+CpB/3eQoz7uX/BGOog==", "requires": { "domino": "^2.1.2", + "tslib": "^2.0.0", "xhr2": "^0.2.0" } }, "@angular/router": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.9.tgz", - "integrity": "sha512-4u+CWMPB4hCkAsFCEzC94YEWT0wVozqGkc/Dortt2hFaqvZpIegg6iJVZlDxuyDjzFYBPnnbTDdgiTTA8ckfuA==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.0.tgz", + "integrity": "sha512-iAaJqcFrwduL1YopLrw4ax6kWd2FrqcGjcf0GY2ZUEEcwo5hQVMrKAt7MUJPVHGZf+OzSYJBgP7ApU60oZ43AA==", + "requires": { + "tslib": "^2.0.0" + } }, "@apidevtools/json-schema-ref-parser": { "version": "9.0.6", @@ -930,15 +1181,10 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true }, "@babel/core": { "version": "7.9.0", @@ -1028,16 +1274,10 @@ "@babel/types": "^7.10.4" }, "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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1057,16 +1297,10 @@ "@babel/types": "^7.10.4" }, "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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1077,27 +1311,207 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", "semver": "^5.5.0" } }, + "@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.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.12.1", + "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.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@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/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.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@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.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "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 + } + } + }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "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" + } + } } }, "@babel/helper-define-map": { @@ -1140,12 +1554,6 @@ "@babel/types": "^7.10.4" } }, - "@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", @@ -1158,9 +1566,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -1175,9 +1583,9 @@ } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1188,24 +1596,18 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "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.10.4" + "@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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1244,16 +1646,10 @@ "@babel/types": "^7.10.4" }, "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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1443,64 +1839,20 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "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": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" }, "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/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.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@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/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1718,24 +2070,18 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "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.11.0" + "@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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1757,13 +2103,18 @@ "@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==", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "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": { "@babel/helper-function-name": "^7.10.4", @@ -1782,12 +2133,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -1821,12 +2172,6 @@ "@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", @@ -1839,9 +2184,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -1856,26 +2201,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1884,12 +2229,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -2066,40 +2411,70 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "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": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@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" + } + }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "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" + } + }, + "@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" + } + }, + "@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": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "@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-json-strings": "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "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", @@ -2107,9 +2482,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -2117,20 +2492,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "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": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "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": { "@babel/helper-plugin-utils": "^7.10.4", @@ -2138,23 +2513,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@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" + } + }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "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.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -2167,6 +2552,15 @@ "@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" + } + }, "@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", @@ -2176,6 +2570,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", @@ -2185,6 +2588,15 @@ "@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" + } + }, "@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", @@ -2231,53 +2643,47 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "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" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "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": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, - "@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.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -2288,27 +2694,27 @@ } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "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": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -2316,7 +2722,7 @@ "@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.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" }, @@ -2331,12 +2737,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -2362,12 +2768,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-optimise-call-expression": { @@ -2380,15 +2786,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -2400,12 +2806,6 @@ "@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", @@ -2418,9 +2818,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -2435,26 +2835,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -2463,12 +2863,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -2480,46 +2880,46 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "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": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "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": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "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", @@ -2527,18 +2927,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "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" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "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": { "@babel/helper-function-name": "^7.10.4", @@ -2574,12 +2974,6 @@ "@babel/types": "^7.10.4" } }, - "@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", @@ -2592,9 +2986,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -2609,9 +3003,9 @@ } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -2622,30 +3016,30 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "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.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "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.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -2660,12 +3054,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -2691,35 +3085,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "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.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@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/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -2733,25 +3129,24 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "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/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -2763,12 +3158,6 @@ "@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", @@ -2781,9 +3170,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -2798,26 +3187,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -2826,12 +3215,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -2843,14 +3232,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "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.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { @@ -2864,12 +3253,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -2895,35 +3284,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "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.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@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/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -2937,25 +3328,24 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "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/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -2967,12 +3357,6 @@ "@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", @@ -2985,9 +3369,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -3002,26 +3386,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -3030,12 +3414,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -3047,14 +3431,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "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.10.5", + "@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" }, "dependencies": { @@ -3068,12 +3453,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -3099,35 +3484,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "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.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@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/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -3141,25 +3528,24 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "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/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -3171,12 +3557,6 @@ "@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", @@ -3189,9 +3569,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -3206,26 +3586,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -3234,12 +3614,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -3251,12 +3631,12 @@ } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "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.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { @@ -3270,12 +3650,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -3301,35 +3681,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "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.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@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/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -3343,25 +3725,24 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "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/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -3385,9 +3766,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -3402,26 +3783,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -3430,12 +3811,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -3447,31 +3828,31 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "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.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "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.10.4" + "@babel/helper-replace-supers": "^7.12.1" }, "dependencies": { "@babel/code-frame": { @@ -3484,12 +3865,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "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.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -3515,12 +3896,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-optimise-call-expression": { @@ -3533,15 +3914,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -3565,9 +3946,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -3582,26 +3963,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -3610,12 +3991,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "ms": { @@ -3627,87 +4008,98 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "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-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "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-runtime": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "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.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "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.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -3715,100 +4107,138 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "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-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "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.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@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.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.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { @@ -4060,38 +4490,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" - }, - "dependencies": { - "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" - } - } + "schema-utils": "^2.7.0" } }, "@jsdevtools/ono": { @@ -4101,77 +4509,46 @@ "dev": true }, "@ngrx/effects": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.2.0.tgz", - "integrity": "sha512-8V09zDIPehGpzgfcgyczelovsVYJvDQhN9wHt37K5A+YCG0CI8nj8FmKokHATwv/S62YqFrOVnr/TZacxpDhBw==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-10.0.1.tgz", + "integrity": "sha512-pw0hRQNlyBBRHH1NRWl3TF+RtEAS4XOSnoTHPtQ84Ib/bEribvexsdEq3k6yLWvR3tLTudb5J6SYwYawcM6omA==", + "requires": { + "tslib": "^2.0.0" + } }, "@ngrx/router-store": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-9.2.0.tgz", - "integrity": "sha512-thu6aU9YWM64oNEk4Srx/mNSeQ2SPJKlTji8MSzfr06qgCMyPSXZBYlfs8HqY+af3eB7XBEhb/4ew4JJ6xC9zw==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-10.0.1.tgz", + "integrity": "sha512-UuTIYJWKhYv5xlhcJw3pz3C+DbLk5DzTWYJ03B7J+O2ELnKlbMDdjoejzNVDGOGKKWjzg/irNvkC/Opu2Zspqg==", + "requires": { + "tslib": "^2.0.0" + } }, "@ngrx/store": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.2.0.tgz", - "integrity": "sha512-V8AI3mxbMztVpbZpALkLZYlGkofKcu9GaOCY5e+sZ1VcJ90oxhFjBpnmd6MuVdmhep1XAHALb1B8ZbBFn+xsgQ==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-10.0.1.tgz", + "integrity": "sha512-ZbPvhp/tRYnS3jZ28mDOX2LH3jfySXT0uv8ffIboM/o9QxBGHpAJyBct2zkpy4duYBc3i/sIbRn+CEpAjLXjHw==", + "requires": { + "tslib": "^2.0.0" + } }, "@ngrx/store-devtools": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.2.0.tgz", - "integrity": "sha512-/FvgcpjO4IvwNFnRVoHGikAvckr6fxKf4NgYoTQ9giI8xavolLvuQUHxzH20legi5dgZz34ii2m2g1Q7OxEV8w==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-10.0.1.tgz", + "integrity": "sha512-kwgF1yjjVn0FER+AG83OLCYSMuX4/E3L+DN4doSoZs4BNO9FdkYIIA4ul1nXT5d6SLiFFTmlufmbgc6HCF3pjQ==", + "requires": { + "tslib": "^2.0.0" + } }, "@ngtools/webpack": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.12.tgz", - "integrity": "sha512-lypMXIq5oxBMsoDu/VOa1yUmmXthhxkCJa8LG0ZohfnbwhmZvz3SAW7omBGuVrb5cVIfLCkaRCSnQ1MNc6ULXw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.2.0.tgz", + "integrity": "sha512-W4SSFNQhIiC8JRhIn3c4mb1+fsFKiHp+THVMAUNo+wRZEt/rgzsCdnqv0EmQJJojZhnilUIyB/wVYJu2+S/Bxg==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.12", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.4", + "@angular-devkit/core": "10.2.0", + "enhanced-resolve": "4.3.0", "webpack-sources": "1.4.3" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz", - "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.4", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "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" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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 - } } }, "@nodelib/fs.scandir": { @@ -4218,18 +4595,30 @@ } }, "@rollup/plugin-commonjs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", - "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", + "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", + "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", - "estree-walker": "^1.0.1", - "glob": "^7.1.2", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0" + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "dependencies": { + "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" + } + } } }, "@rollup/plugin-json": { @@ -4242,290 +4631,282 @@ } }, "@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", + "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", - "@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.17.0" }, "dependencies": { - "@angular-devkit/core": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.3.tgz", - "integrity": "sha512-E49GCnn06q79Xd5SC/+8CDRF1wp9wQqP6HKJVVMijoi3NOrMQTuHTesPURvve2xbkCYqQOVlMEonhOJF5vpnoQ==", - "requires": { - "ajv": "6.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0" - } - }, - "@angular-devkit/schematics": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.3.tgz", - "integrity": "sha512-t5I77YeRCWpr5PJMQn8iCu2zHqnQt7qqxt66ejmsDnFgCQDw2G1IQl48AzjegJybIoRCaWX12yUZaS5aaJm5Cg==", - "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" - } - }, - "@schematics/angular": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.3.tgz", - "integrity": "sha512-8dRe7mBPqesscXG56pg7bWgDz+xb8jmU/Yp6LizOL3U0EoO/QV6yuVgPkgiIMSaGQaP3PBzZ7h0xuOOogWJ6ig==", - "requires": { - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "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=" - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "requires": { - "sourcemap-codec": "^1.4.4" - } + "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 }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "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" } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - } } } }, "@rollup/pluginutils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz", - "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==", + "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": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", - "micromatch": "^4.0.2" + "picomatch": "^2.2.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.7.tgz", + "integrity": "sha512-ld3WcoMWvup04V3OWioQ+AFGQBzz7IDM4Fxc5+Qc3wILWkDJnNkrc4EmJAow96Ab4/T1+Wl1vof3tV4At0BTzA==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.7", + "@angular-devkit/schematics": "9.1.7" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.7.tgz", + "integrity": "sha512-guvolu9Cl+qYMTtedLZD9wCqustJjdqzJ2psD2C1Sr1LrX9T0mprmDldR/YnhsitThveJEb6sM/0EvqWxoSvKw==", + "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" + } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "@angular-devkit/schematics": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.7.tgz", + "integrity": "sha512-oeHPJePBcPp/bd94jHQeFUnft93PGF5iJiKV9szxqS8WWC5OMZ5eK7icRY0PwvLyfenspAZxdZcNaqJqPMul5A==", + "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "@angular-devkit/core": "9.1.7", + "ora": "4.0.3", + "rxjs": "6.5.4" } }, - "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==" + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "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" + } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { - "invert-kv": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "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": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0" + "color-name": "~1.1.4" } }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "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 + }, + "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": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "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" + } + } } }, - "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==", + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "tslib": "^1.9.0" } }, + "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 + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": "^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=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "requires": { - "camelcase": "^4.1.0" - } - } + "ansi-regex": "^5.0.0" } }, - "yargs-parser": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", - "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", + "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": { - "camelcase": "^4.1.0" + "has-flag": "^4.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 } } }, - "@schematics/angular": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.7.tgz", - "integrity": "sha512-ld3WcoMWvup04V3OWioQ+AFGQBzz7IDM4Fxc5+Qc3wILWkDJnNkrc4EmJAow96Ab4/T1+Wl1vof3tV4At0BTzA==", - "dev": true, - "requires": { - "@angular-devkit/core": "9.1.7", - "@angular-devkit/schematics": "9.1.7" - } - }, "@schematics/update": { - "version": "0.901.7", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.7.tgz", - "integrity": "sha512-6IpQVFvbu47CrXfqqHAzv2vi7AOdfi1S+SiayXU6FWTeA2wV47H8R60VjxurL8JkDGoVhFgC4+lK6KG++g3dQw==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz", + "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.7", - "@angular-devkit/schematics": "9.1.7", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", "pacote": "9.5.12", - "rxjs": "6.5.4", - "semver": "7.1.3", + "semver": "7.3.2", "semver-intersect": "1.4.0" }, "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "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 } } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, "@swimlane/ngx-charts": { - "version": "13.0.4", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-13.0.4.tgz", - "integrity": "sha512-4EvwclbctVQ5VzPBC63DJsg+jwQU/NlR/yQ9ObVH5acefEbS8kupn3cp/gaWftLTQ0jdXqRqycHNkLOQZfa3XQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-16.0.0.tgz", + "integrity": "sha512-ltbyA7qhnbdNcjWD0NerObHrDzWgDDja8M8R1RVgBZnkaoJFpB/KZ1W3+Ch9F1y9pCy/zdpWSzwd/RzCEhsQhA==", "requires": { "d3-array": "^2.4.0", "d3-brush": "^1.1.5", @@ -4537,15 +4918,16 @@ "d3-selection": "^1.4.1", "d3-shape": "^1.3.7", "d3-time-format": "^2.2.2", - "d3-transition": "^1.3.2" + "d3-transition": "^1.3.2", + "tslib": "^2.0.0" } }, "@swimlane/ngx-graph": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-7.0.1.tgz", - "integrity": "sha512-V85EuEJr61AM3J24slsiUkg6eak6J8IBy5zeD55fywLl3QbndRELRp3l/T2wu/HNpzyHzrC0/qpkEauqcHtRsA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-7.2.0.tgz", + "integrity": "sha512-W9/UfwxKp5+vevATgka1alMQwB5g0GYcZf1EkBp4cPOXUthDl3hgmw4v1fXAszO92qT9jzSgGGpufKlZDt0yJQ==", "requires": { - "@swimlane/ngx-charts": "^13.0.1", + "@swimlane/ngx-charts": "^16.0.0", "d3-dispatch": "^1.0.3", "d3-ease": "^1.0.5", "d3-force": "^1.1.0", @@ -4555,18 +4937,10 @@ "d3-transition": "^1.1.1", "dagre": "^0.8.4", "transformation-matrix": "^1.15.3", + "tslib": "^2.0.0", "webcola": "^3.3.8" } }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4626,6 +5000,12 @@ "@types/jasmine": "*" } }, + "@types/js-yaml": { + "version": "3.12.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", + "integrity": "sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww==", + "dev": true + }, "@types/json-schema": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", @@ -4643,9 +5023,9 @@ } }, "@types/marked": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.4.tgz", - "integrity": "sha512-fdg0NO4qpuHWtZk6dASgsrBggY+8N4dWthl1bAQG9ceKUNKFjqpHaDKCAhRUI6y8vavG7hLSJ4YBwJtZyZEXqw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-1.1.0.tgz", + "integrity": "sha512-j8XXj6/l9kFvCwMyVqozznqpd/nk80krrW+QiIJN60Uu9gX5Pvn4/qPJ2YngQrR3QREPwmrE1f9/EWKVTFzoEw==" }, "@types/minimatch": { "version": "3.0.3", @@ -4705,9 +5085,9 @@ } }, "@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": "*" @@ -4726,9 +5106,9 @@ "dev": true }, "@types/stacktrace-js": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/stacktrace-js/-/stacktrace-js-0.0.32.tgz", - "integrity": "sha512-SdxmlrHfO0BxgbBP9HZWMUo2rima8lwMjPiWm6S0dyKkDa5CseamktFhXg8umu3TPVBkSlX6ZoB5uUDJK89yvg==" + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz", + "integrity": "sha512-aqJ6QM9QThNL4dHBhwl1f9B0oDqiREkYLn9RldghUKsGeFWWGlCsqsRWxbh+hDvvmptMFqc4aIfFIGz9BBu8Qg==" }, "@types/tough-cookie": { "version": "4.0.0", @@ -4756,178 +5136,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" } }, @@ -4959,6 +5338,12 @@ "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==", + "dev": true + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -4998,6 +5383,16 @@ } } }, + "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" + } + }, "adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -5052,12 +5447,14 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "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==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true }, "alphanum-sort": { "version": "1.0.2", @@ -5080,55 +5477,6 @@ "@tweenjs/tween.js": "^17.1.0" } }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.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 - }, - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "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": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -5160,7 +5508,6 @@ "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" } @@ -5182,9 +5529,9 @@ } }, "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": { @@ -5238,6 +5585,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", @@ -5457,15 +5810,16 @@ } }, "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": { "find-cache-dir": { @@ -5525,8 +5879,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -5616,6 +5969,23 @@ "tweetnacl": "^0.14.3" } }, + "bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "requires": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + } + } + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -5631,11 +6001,21 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "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 }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -5674,158 +6054,51 @@ "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "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 - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.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" - } - }, - "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 - }, - "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==", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "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" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "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", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5947,15 +6220,15 @@ } }, "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "browserstack": { @@ -6101,35 +6374,46 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==" + }, "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": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -6140,6 +6424,24 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "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" + } } } }, @@ -6160,50 +6462,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - } - } - }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -6288,9 +6546,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001079", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001079.tgz", - "integrity": "sha512-2KaYheg0iOY+CMmDuAB3DHehrXhhb4OZU4KBVGDr/YKyYAcpudaiUQ9PJ9rxrPlKEoJ3ATasQ5AN48MqpwS43Q==", + "version": "1.0.30001151", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz", + "integrity": "sha512-Zh3sHqskX6mHNrqUerh+fkf0N72cMxrmflzje/JyVImfpknscMnkeJrlFGJcqTmaa0iszdYptGpWMJCRQDkBVw==", "dev": true }, "canonical-path": { @@ -6302,8 +6560,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "2.4.2", @@ -6334,9 +6591,9 @@ "dev": true }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "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", @@ -6346,18 +6603,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "readdirp": "~3.5.0" } }, "chownr": { @@ -6373,14 +6619,16 @@ "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 + } } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -6425,35 +6673,12 @@ } } }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "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 - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", - "dev": true - }, "cli-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", @@ -6478,9 +6703,9 @@ } }, "cli-spinners": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", - "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", + "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": { @@ -6546,26 +6771,6 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6600,25 +6805,54 @@ "js-yaml": "3.13.1", "teeny-request": "6.0.1", "urlgrey": "0.4.4" + }, + "dependencies": { + "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" + } + } } }, "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 + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6630,6 +6864,12 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "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 } } }, @@ -6644,20 +6884,19 @@ } }, "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" } }, "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" } @@ -6665,19 +6904,24 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "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", @@ -6729,6 +6973,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", @@ -6756,8 +7009,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -6771,37 +7023,6 @@ "typedarray": "^0.0.6" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "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==", - "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 - } - } - }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -7116,6 +7337,7 @@ "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", @@ -7143,12 +7365,6 @@ "randomfill": "^1.0.3" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", @@ -7186,50 +7402,52 @@ } }, "css-loader": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", - "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz", + "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==", "dev": true, "requires": { - "camelcase": "^5.3.1", + "camelcase": "^6.0.0", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.27", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.3", - "schema-utils": "^2.6.5", - "semver": "^6.3.0" - }, - "dependencies": { - "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": "^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.0", + "semver": "^7.3.2" + }, + "dependencies": { + "camelcase": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", + "dev": true }, - "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": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "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 + }, + "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 } } @@ -7262,14 +7480,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": { @@ -7291,9 +7508,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "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": { @@ -7450,14 +7667,14 @@ } }, "d3-array": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", - "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", + "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" }, "d3-brush": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", - "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", "requires": { "d3-dispatch": "1", "d3-drag": "1", @@ -7507,9 +7724,9 @@ } }, "d3-format": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", - "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" }, "d3-hierarchy": { "version": "1.1.9", @@ -7535,15 +7752,15 @@ "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" }, "d3-scale": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", - "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", "requires": { - "d3-array": "1.2.0 - 2", - "d3-format": "1", - "d3-interpolate": "^1.2.0", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" } }, "d3-selection": { @@ -7560,16 +7777,23 @@ } }, "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.0.0.tgz", + "integrity": "sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==" }, "d3-time-format": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", - "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", "requires": { "d3-time": "1" + }, + "dependencies": { + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + } } }, "d3-timer": { @@ -7614,6 +7838,17 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, "date-format": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", @@ -7638,7 +7873,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", @@ -7646,15 +7882,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -7669,12 +7896,6 @@ "regexp.prototype.flags": "^1.2.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -7730,12 +7951,6 @@ } } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -7998,9 +8213,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.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -8018,9 +8233,9 @@ "dev": true }, "domino": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.5.tgz", - "integrity": "sha512-vMDo7f6ogUV9PkzmxXLiXzJkJZqU09Le4C40mj+HmAGS/2FPmdetoNOQZXpu2kekn0GJKvtwKMAVoruTj60Xww==" + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" }, "domutils": { "version": "1.7.0", @@ -8033,18 +8248,12 @@ } }, "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" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } } }, "duplexer": { @@ -8053,12 +8262,6 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -8088,9 +8291,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.465", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.465.tgz", - "integrity": "sha512-K/lUeT3NLAsJ5SHRDhK3/zd0tw7OUllYD8w+fTOXm6ljCPsp2qq+vMzxpLo8u1M27ZjZAjRbsA6rirvne2nAMQ==", + "version": "1.3.584", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.584.tgz", + "integrity": "sha512-NB3DzrTzJFhWkUp+nl2KtUtoFzrfGXTir2S+BU4tXGyXH9vlluPuFpE3pTKeH7+PY460tHLjKzh6K2+TWwW+Ww==", "dev": true }, "elliptic": { @@ -8134,18 +8337,30 @@ "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, "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": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -8253,9 +8468,9 @@ } }, "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", @@ -8270,9 +8485,9 @@ "dev": true }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true }, "err-code": { @@ -8300,11 +8515,11 @@ } }, "error-stack-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", - "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", "requires": { - "stackframe": "^1.1.0" + "stackframe": "^1.1.1" } }, "es-abstract": { @@ -8440,10 +8655,10 @@ "es6-symbol": "^3.1.1" } }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { @@ -8455,8 +8670,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.8.1", @@ -8713,9 +8927,9 @@ "dev": true }, "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", + "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==", "dev": true }, "esutils": { @@ -8790,6 +9004,7 @@ "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", @@ -9127,6 +9342,13 @@ "schema-utils": "^2.6.5" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -9254,11 +9476,12 @@ "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": "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": "^2.0.0" + "locate-path": "^3.0.0" } }, "flat-cache": { @@ -9461,9 +9684,9 @@ } }, "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "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": { "at-least-node": "^1.0.0", @@ -9473,13 +9696,21 @@ }, "dependencies": { "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "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": "^1.0.0" + "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 + } } }, "universalify": { @@ -9525,8 +9756,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.3", @@ -9587,6 +9817,7 @@ "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" } @@ -9610,7 +9841,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9621,33 +9851,12 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "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" - } - } - } - }, - "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "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": { - "ini": "^1.3.5" + "is-glob": "^4.0.1" } }, "global-modules": { @@ -9677,8 +9886,7 @@ "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 + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "11.0.1", @@ -9757,25 +9965,6 @@ } } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -9877,8 +10066,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-glob": { "version": "1.0.0", @@ -9958,12 +10146,6 @@ } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -10102,6 +10284,12 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-cache-semantics": { + "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": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -10422,12 +10610,6 @@ "resolve-from": "^3.0.0" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -10453,7 +10635,8 @@ "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true }, "indexof": { "version": "0.0.1", @@ -10471,7 +10654,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -10480,8 +10662,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -10490,27 +10671,38 @@ "dev": true }, "injection-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.3.0.tgz", - "integrity": "sha512-rhS6E5jv603kbaO72ylOt0hGF1LT03oqQ4GU5KOO0qSaRbIWmdUCHjXq+VT79jL6/NmXtw9ccfK6dh/CzjoYjA==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.3.1.tgz", + "integrity": "sha512-t+kpDAOL/DUZ68JncAhsb8C91qhJ6dXRMcOuvJfNA7sp63etdiQe6KQoxE/nZ5b2eTi0TQX6OothOCm89cLAJQ==", + "dev": true, + "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==", + "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" @@ -10523,25 +10715,30 @@ "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", "supports-color": "^7.1.0" } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10569,6 +10766,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "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" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -10590,13 +10796,19 @@ } }, "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" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, @@ -10687,14 +10899,6 @@ "dev": true, "requires": { "binary-extensions": "^2.0.0" - }, - "dependencies": { - "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==", - "dev": true - } } }, "is-buffer": { @@ -10709,15 +10913,6 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-color-stop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", @@ -10732,6 +10927,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "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", @@ -10784,9 +10988,9 @@ "dev": true }, "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": { @@ -10819,24 +11023,6 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - } - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -10868,10 +11054,10 @@ "xtend": "^4.0.0" } }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true }, "is-number": { @@ -10880,6 +11066,12 @@ "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-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -10931,20 +11123,12 @@ "dev": true }, "is-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz", - "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==", + "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": "0.0.44" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", - "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==", - "dev": true - } + "@types/estree": "*" } }, "is-regex": { @@ -10971,7 +11155,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-svg": { "version": "3.0.0", @@ -11018,12 +11203,6 @@ "is-docker": "^2.0.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -11039,7 +11218,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -11522,11 +11702,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.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -11551,13 +11732,12 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "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.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11572,14 +11752,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -11587,6 +11760,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": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -12204,21 +12383,12 @@ } }, "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", - "dev": true, - "requires": { - "colors": "^1.1.2" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", + "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", "dev": true, "requires": { - "json-buffer": "3.0.0" + "colors": "^1.1.2" } }, "killable": { @@ -12242,33 +12412,37 @@ "graceful-fs": "^4.1.11" } }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "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 + }, "known-css-properties": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.3.0.tgz", "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", + "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", "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", - "native-request": "^1.0.5", + "promise": "^7.1.1", + "request": "^2.83.0", "source-map": "~0.6.0", "tslib": "^1.10.0" }, @@ -12279,46 +12453,25 @@ "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": "6.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz", + "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==", "dev": true, "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" - }, - "dependencies": { - "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" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } + "clone": "^2.1.2", + "less": "^3.11.3", + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" } }, "leven": { @@ -12347,9 +12500,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.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -12389,11 +12542,12 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, @@ -12437,6 +12591,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -12444,12 +12604,63 @@ "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==", + "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": "^2.4.2" + "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": { @@ -12502,12 +12713,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12609,12 +12814,6 @@ "y18n": "^4.0.0" } }, - "http-cache-semantics": { - "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 - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -12626,16 +12825,11 @@ } } }, - "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" } @@ -12667,9 +12861,9 @@ "integrity": "sha1-55ZqFe6louprSJXSW364It199Fs=" }, "marked": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", - "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.2.tgz", + "integrity": "sha512-5jjKHVl/FPo0Z6ocP3zYhKiJLzkwJAw4CZoLjv57FkvbUuwOX4LIBBGGcXjAY6ATcd1q9B8UTj5T9Umauj0QYQ==" }, "matched": { "version": "1.0.2", @@ -12857,18 +13051,13 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "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": "0.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz", + "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -12938,7 +13127,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -12946,24 +13134,16 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "yallist": "^4.0.0" } }, "minipass-collect": { @@ -13167,6 +13347,13 @@ "thenify-all": "^1.0.0" } }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -13186,13 +13373,6 @@ "to-regex": "^3.0.1" } }, - "native-request": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", - "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", - "dev": true, - "optional": true - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -13212,222 +13392,71 @@ "dev": true }, "ng-packagr": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-9.1.5.tgz", - "integrity": "sha512-biuNfM15uLkCW+Vvj8bnuwjX37oX7j5icGm+l71FhM6ydlEl+Cl7PdFXpy9rrIlKFYlYRiPiiiWazGwVGn1icQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-10.1.2.tgz", + "integrity": "sha512-pm61gu6jPkohL8tFWk+2DwUtb3rs5GpND1ZjKUYv5WUJPUQmBfG5WvEO/CDVQpSDWhNWWLTt17NIQ+RS3hNUHg==", "dev": true, "requires": { - "@rollup/plugin-commonjs": "^11.0.2", + "@rollup/plugin-commonjs": "^15.0.0", "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-node-resolve": "^7.1.0", - "ajv": "^6.10.2", - "autoprefixer": "^9.7.6", - "browserslist": "^4.12.0", - "chalk": "^4.0.0", + "@rollup/plugin-node-resolve": "^9.0.0", + "ajv": "^6.12.3", + "ansi-colors": "^4.1.1", + "autoprefixer": "^9.6.5", + "browserslist": "^4.7.0", "chokidar": "^3.2.1", - "clean-css": "^4.1.11", - "commander": "^4.0.0", - "fs-extra": "^9.0.0", - "glob": "^7.1.2", - "injection-js": "^2.2.1", - "less": "^3.10.3", - "node-sass-tilde-importer": "^1.0.0", - "postcss": "^7.0.18", - "postcss-url": "^8.0.0", - "read-pkg-up": "^5.0.0", - "rimraf": "^3.0.0", - "rollup": "2.7.5", - "rollup-plugin-sourcemaps": "^0.6.0", - "rxjs": "^6.5.0", - "sass": "^1.23.0", - "stylus": "^0.54.7", - "terser": "^4.3.8", - "update-notifier": "^4.0.0" - }, - "dependencies": { - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "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" - } - }, - "postcss": { - "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", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "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" - } - } - } - } - } - }, - "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" - }, - "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" - } - }, - "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.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" - } - } - } - }, - "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 - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "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" - } - }, - "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-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "commander": "^6.0.0", + "cssnano-preset-default": "^4.0.7", + "fs-extra": "^9.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.10.3", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.29", + "postcss-url": "^8.0.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^3.0.0", + "rollup": "^2.8.0", + "rollup-plugin-sourcemaps": "^0.6.0", + "rxjs": "^6.5.0", + "sass": "^1.23.0", + "stylus": "^0.54.7", + "terser": "^5.0.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": { - "p-limit": "^2.0.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" } }, - "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==", + "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 }, - "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" - } - }, - "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": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true }, - "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==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^5.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "rimraf": { @@ -13440,63 +13469,54 @@ } }, "rollup": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.7.5.tgz", - "integrity": "sha512-xQSM8uzhgtF6tTnTVEvOQThrcG3LPUP3T/4l4EukzDp0kbTY1QRDuXjiwtYzs9odKj9Bj/PccRG6viFfS7DmCQ==", + "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" } }, - "rollup-plugin-sourcemaps": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.2.tgz", - "integrity": "sha512-9AwTKg3yRykwzemfLt71ySe0LvrAci+bpsOL1LaTYFk5BX4HF6X7DQfpHa74ANfSja3hyjiQkXCR8goSOnW//Q==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.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-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": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "terser": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", + "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "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 + } } - }, - "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 } } }, "ngrx-store-localstorage": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-9.0.0.tgz", - "integrity": "sha512-F69yiNruZe9jgXcPykfbyKFuM/1JzL+wsBUM+TTfMDXIoaFO7xwuZF9yLG8zbvdglibtJ0OG2M8fy3oadWuV4A==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-10.1.1.tgz", + "integrity": "sha512-OacpqJMraLrgqr/T3DfyT4T4lqAISZdCPWmYQyHtXWsNgKGid6xL4SgPktJ3vcMbIuuMckOpEFIgIpgBvf8E3g==", "requires": { - "deepmerge": "^3.2.0" + "deepmerge": "^3.2.0", + "tslib": "^2.0.0" } }, "ngx-moment": { @@ -13505,6 +13525,13 @@ "integrity": "sha512-QC/5XNC0BW6WkJkwZT4r2A29j/8sJAmhuQJrEnEdpW35GvkemccuxEUAwo/PwkzPB/CHaquR00E6P2HVEQ1iEg==", "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==" + } } }, "ngx-monaco-editor": { @@ -13515,7 +13542,8 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "node-fetch": { "version": "2.6.1", @@ -13589,9 +13617,9 @@ } }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.64", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", + "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==", "dev": true }, "node-sass-tilde-importer": { @@ -13691,12 +13719,21 @@ }, "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": "^6.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": { - "lru-cache": "^5.1.1" + "yallist": "^4.0.0" } }, "semver": { @@ -13719,9 +13756,9 @@ } }, "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", @@ -13847,6 +13884,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -14248,30 +14286,31 @@ "dev": true }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "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.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -14294,9 +14333,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { @@ -14332,15 +14371,75 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "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.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "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-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 + }, + "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-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" + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + } } }, "object.getownpropertydescriptors": { @@ -14354,22 +14453,22 @@ }, "dependencies": { "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" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -14390,47 +14489,25 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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" } }, "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.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } } } }, @@ -14456,20 +14533,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", - "is-regex": "^1.1.0", - "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", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -14492,9 +14569,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { @@ -14544,18 +14621,18 @@ } }, "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" } }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -14618,16 +14695,16 @@ } }, "ora": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", - "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", "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" @@ -14640,19 +14717,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", @@ -14690,9 +14766,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" @@ -14737,36 +14813,34 @@ "os-tmpdir": "^1.0.0" } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "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": "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": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-map": { @@ -14788,9 +14862,10 @@ } }, "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 }, "package-hash": { "version": "4.0.0", @@ -14801,55 +14876,7 @@ "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "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==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.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 - } + "release-zalgo": "^1.0.0" } }, "pacote": { @@ -14922,6 +14949,16 @@ "minipass": "^2.6.0" } }, + "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", @@ -15038,6 +15075,23 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "optional": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -15083,13 +15137,13 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -15100,7 +15154,8 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.6", @@ -15191,60 +15246,6 @@ "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-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "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" - } - }, - "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 - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" } }, "pluralize": { @@ -15253,6 +15254,15 @@ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "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.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -15273,15 +15283,6 @@ "ms": "^2.1.1" } }, - "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" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -15316,9 +15317,9 @@ } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "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", @@ -15422,9 +15423,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -15630,9 +15631,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "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", @@ -15708,16 +15709,6 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "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==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", @@ -15738,28 +15729,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "postcss": { - "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", - "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 } } }, @@ -15910,14 +15884,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": { @@ -16056,6 +16031,15 @@ } } }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, "protoduck": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", @@ -16280,6 +16264,7 @@ "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" @@ -16313,15 +16298,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -16413,47 +16389,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==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "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" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz", + "integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==", "dev": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" } }, "read-cache": { @@ -16474,14 +16416,13 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", "dev": true, "requires": { "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" } @@ -16497,6 +16438,48 @@ "util-promisify": "^2.1.0" } }, + "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": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + }, + "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": "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" + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -16525,9 +16508,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "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" @@ -16574,9 +16557,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": { @@ -16598,6 +16581,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", @@ -16609,20 +16598,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", - "is-regex": "^1.1.0", - "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", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -16645,9 +16634,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { @@ -16667,38 +16656,6 @@ } } }, - "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==", - "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" - } - }, - "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", @@ -16800,7 +16757,8 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-main-filename": { "version": "2.0.0", @@ -16892,13 +16850,67 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "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": { - "lowercase-keys": "^1.0.0" + "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": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "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 + } } }, "restore-cursor": { @@ -16929,6 +16941,30 @@ "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", @@ -16967,14 +17003,36 @@ } }, "rollup": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", - "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.5.tgz", + "integrity": "sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA==", "dev": true, "requires": { "fsevents": "~2.1.2" } }, + "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": { + "@rollup/pluginutils": "^3.0.9", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "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": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + } + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -17003,22 +17061,243 @@ "dev": true }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "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==" + } + } + }, + "rxjs-report-usage": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/rxjs-report-usage/-/rxjs-report-usage-1.0.5.tgz", + "integrity": "sha512-jZeg+TTkvP8kAv0tIQj3WOuIhYLi+Ig9mG8DCc+nJHQ1ObJr8IaeNPbJmXDRfHvH3MKQMBzboY4RbQ6jWt6cIg==", + "requires": { + "@babel/parser": "~7.10.3", + "@babel/traverse": "~7.10.3", + "@babel/types": "~7.10.3", + "bent": "~7.3.6", + "chalk": "~4.1.0", + "glob": "~7.1.6", + "prompts": "~2.3.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.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==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "rxjs-spy": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/rxjs-spy/-/rxjs-spy-7.5.1.tgz", - "integrity": "sha512-dJ9mO4HvW2r16PsU15Qsc0RVkG7pFrfyCNTGx3vrxWje3kIgZ6QjMVnWblQxbniZ32lwLk/2x9+D2O6GhgXV/w==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/rxjs-spy/-/rxjs-spy-7.5.3.tgz", + "integrity": "sha512-8QsSL6Ma51dTeaJ5Q9zWqhqnCSEkDf56Evs1gUsI9N22oB7bYrPMMx4UnoifNGc+Pko2sGX/xydzinLwGO+2pw==", "requires": { "@types/circular-json": "^0.4.0", - "@types/stacktrace-js": "^0.0.32", + "@types/stacktrace-js": "^0.0.33", "circular-json": "^0.5.0", "error-stack-parser": "^2.0.1", + "rxjs-report-usage": "^1.0.4", "stacktrace-gps": "^3.0.2" } }, @@ -17189,6 +17468,14 @@ "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.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 + } } }, "which-module": { @@ -17334,42 +17621,28 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.1.tgz", + "integrity": "sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==", "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.3", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" }, "dependencies": { - "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" - } + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "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 } } @@ -17497,24 +17770,8 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "semver-dsl": { "version": "1.0.1", @@ -17628,7 +17885,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-immediate-shim": { "version": "1.0.1", @@ -17681,19 +17939,11 @@ "safe-buffer": "^5.0.1" } }, - "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" - } - }, "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" } @@ -17701,7 +17951,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shell-quote": { "version": "1.7.2", @@ -17712,7 +17963,8 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true }, "simple-swizzle": { "version": "0.2.2", @@ -17731,6 +17983,11 @@ } } }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", @@ -18064,34 +18321,32 @@ "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, "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.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz", + "integrity": "sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw==", "dev": true, "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - }, - "dependencies": { - "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==", + "data-urls": "^2.0.0", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0", + "source-map": "^0.6.1" + }, + "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": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "safer-buffer": ">= 2.1.2 < 3.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 } } }, @@ -18135,7 +18390,8 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true }, "spawn-wrap": { "version": "2.0.0", @@ -18232,12 +18488,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.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.1" + "ms": "2.1.2" } }, "ms": { @@ -18263,12 +18519,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.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.1" + "ms": "2.1.2" } }, "ms": { @@ -18291,9 +18547,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" @@ -18366,17 +18622,17 @@ "dev": true }, "stackframe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", - "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, "stacktrace-gps": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.3.tgz", - "integrity": "sha512-51Rr7dXkyFUKNmhY/vqZWK+EvdsfFSRiQVtgHTFlAdNIYaDD7bVh21yBHXaNWAvTD+w+QSjxHg7/v6Tz4veExA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", + "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", "requires": { "source-map": "0.5.6", - "stackframe": "^1.1.0" + "stackframe": "^1.1.1" } }, "static-extend": { @@ -18591,32 +18847,33 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" }, "dependencies": { "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.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.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-negative-zero": "^2.0.0", + "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" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -18637,47 +18894,25 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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" } }, "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.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } } } }, @@ -18702,32 +18937,33 @@ } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" }, "dependencies": { "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.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.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-negative-zero": "^2.0.0", + "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" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -18748,47 +18984,25 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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" } }, "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.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - } } } }, @@ -18813,12 +19027,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "stubs": { @@ -18828,35 +19037,13 @@ "dev": true }, "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": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" - }, - "dependencies": { - "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" - } - } + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" } }, "stylehacks": { @@ -18884,18 +19071,18 @@ } }, "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", "dev": true, "requires": { "css-parse": "~2.0.0", "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", + "semver": "^6.0.0", "source-map": "^0.7.3" }, "dependencies": { @@ -18908,12 +19095,6 @@ "ms": "2.0.0" } }, - "mkdirp": { - "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", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -19227,16 +19408,10 @@ } } }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", - "dev": true - }, "terser": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", - "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz", + "integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -19253,131 +19428,35 @@ } }, "terser-webpack-plugin": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", - "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==", "dev": true, "requires": { - "cacache": "^15.0.4", + "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", + "jest-worker": "^26.3.0", + "p-limit": "^3.0.2", "schema-utils": "^2.6.6", - "serialize-javascript": "^3.1.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.6.13", + "terser": "^5.0.0", "webpack-sources": "^1.4.3" }, "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "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 - }, - "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.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" - } - }, - "minipass": { - "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" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { - "glob": "^7.1.3" + "p-try": "^2.0.0" } }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "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" @@ -19388,26 +19467,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "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" - } - }, - "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" - } } } }, @@ -19469,9 +19528,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" @@ -19517,8 +19576,7 @@ "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 + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -19540,12 +19598,6 @@ } } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -19583,6 +19635,15 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, "transformation-matrix": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", @@ -19612,10 +19673,16 @@ "yn": "3.1.1" } }, + "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.2", @@ -19652,6 +19719,12 @@ "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 } } }, @@ -19662,6 +19735,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": { @@ -19732,9 +19813,9 @@ } }, "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 }, "ua-parser-js": { @@ -19817,7 +19898,8 @@ "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true }, "uniqs": { "version": "2.0.0", @@ -19843,33 +19925,24 @@ "imurmurhash": "^0.1.4" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "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.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.1" + "ms": "2.1.2" } }, "ms": { @@ -19944,79 +20017,6 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.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 - }, - "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.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" - } - } - } - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -20059,23 +20059,6 @@ "requires-port": "^1.0.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } - } - }, "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", @@ -20142,20 +20125,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.0", - "is-regex": "^1.1.0", - "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", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -20178,9 +20161,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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-regex": { @@ -20337,35 +20320,6 @@ "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "watchpack-chokidar2": { @@ -20401,6 +20355,13 @@ } } }, + "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", @@ -20483,7 +20444,34 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "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" + }, + "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, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } }, "is-binary-path": { "version": "1.0.1", @@ -20608,41 +20596,47 @@ "selenium-webdriver": "^3.0.1" } }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "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": { "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 }, "braces": { @@ -20843,6 +20837,17 @@ "figgy-pudding": "^3.5.1" } }, + "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.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -20965,6 +20970,12 @@ } } }, + "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", @@ -21015,12 +21026,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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.1" + "ms": "2.1.2" } }, "fill-range": { @@ -21051,7 +21062,32 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, - "optional": true + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "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" + } + } + } }, "is-absolute-url": { "version": "3.0.3", @@ -21193,9 +21229,9 @@ } }, "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.4.1", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz", + "integrity": "sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw==", "dev": true, "requires": { "webpack-sources": "^1.3.0" @@ -21216,6 +21252,23 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "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==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, "when": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", @@ -21226,6 +21279,7 @@ "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" } @@ -21236,49 +21290,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -21301,9 +21312,9 @@ } }, "worker-plugin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", - "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", + "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" @@ -21417,12 +21428,6 @@ "async-limiter": "~1.0.0" } }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xhr2": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", @@ -21517,55 +21522,12 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "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" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "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-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "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" - } - }, - "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 - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json index 959d1837c0..ee4f176af5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stratos", - "version": "4.3.0", + "version": "4.4.0", "description": "Stratos Console", "main": "index.js", "scripts": { @@ -29,6 +29,7 @@ "test-frontend:cf-autoscaler": "NG_TEST_SUITE=autoscaler ng test cf-autoscaler --code-coverage --watch=false", "test-frontend:extensions": "NG_TEST_SUITE=extensions ng test extensions --code-coverage --watch=false", "test-frontend:kubernetes": "NG_TEST_SUITE=kubernetes ng test kubernetes --code-coverage --watch=false", + "test-frontend:git": "NG_TEST_SUITE=git ng test git --code-coverage --watch=false", "posttest": "nyc report --reporter=html --reporter=lcovonly --reporter=json --tempDir=coverage/nyc", "codecov": "codecov -f coverage/coverage-final.json -F frontend", "lint": "ng lint --format stylish", @@ -49,28 +50,28 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^9.1.6", - "@angular/cdk": "^9.2.3", - "@angular/common": "^9.1.6", - "@angular/compiler": "^9.1.6", - "@angular/core": "^9.1.6", - "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "^9.1.6", - "@angular/material": "^9.2.3", - "@angular/material-moment-adapter": "^9.2.3", - "@angular/platform-browser": "^9.1.6", - "@angular/platform-browser-dynamic": "^9.1.6", - "@angular/platform-server": "^9.1.6", - "@angular/router": "^9.1.6", + "@angular/animations": "^10.2.0", + "@angular/cdk": "^10.2.0", + "@angular/common": "^10.2.0", + "@angular/compiler": "^10.2.0", + "@angular/core": "^10.2.0", + "@angular/flex-layout": "^10.0.0-beta.32", + "@angular/forms": "^10.2.0", + "@angular/material": "^10.2.5", + "@angular/material-moment-adapter": "^10.2.5", + "@angular/platform-browser": "^10.2.0", + "@angular/platform-browser-dynamic": "^10.2.0", + "@angular/platform-server": "^10.2.0", + "@angular/router": "^10.2.0", "@cfstratos/ajsf-material": "^0.1.6", "@cfstratos/monaco-yaml": "^2.5.0", - "@ngrx/effects": "^9.1.2", - "@ngrx/router-store": "^9.1.2", - "@ngrx/store": "^9.1.2", - "@ngrx/store-devtools": "^9.1.2", - "@swimlane/ngx-charts": "^13.0.3", - "@swimlane/ngx-graph": "^7.0.1", - "@types/marked": "^0.7.4", + "@ngrx/effects": "^10.0.1", + "@ngrx/router-store": "^10.0.1", + "@ngrx/store": "^10.0.1", + "@ngrx/store-devtools": "^10.0.1", + "@swimlane/ngx-charts": "^16.0.0", + "@swimlane/ngx-graph": "^7.2.0", + "@types/marked": "^1.1.0", "@types/moment-timezone": "^0.5.13", "angular2-virtual-scroll": "^0.4.16", "core-js": "^3.6.5", @@ -78,19 +79,19 @@ "intersect": "^1.0.1", "lodash-es": "^4.17.14", "mappy-breakpoints": "^0.2.3", - "marked": "^0.8.2", + "marked": "^1.1.0", "moment": "^2.24.0", - "moment-timezone": "^0.5.28", - "ngrx-store-localstorage": "9.0.0", + "moment-timezone": "^0.5.13", + "ngrx-store-localstorage": "10.1.1", "ngx-moment": "^3.5.0", "ngx-monaco-editor": "^9.0.0", "normalizr": "^3.6.0", "reselect": "^4.0.0", - "rxjs": "^6.5.5", - "rxjs-spy": "^7.0.2", + "rxjs": "^6.6.3", + "rxjs-spy": "^7.5.2", "rxjs-websockets": "~8.0.1", "ts-md5": "^1.2.7", - "tslib": "^1.10.0", + "tslib": "^2.0.3", "web-animations-js": "^2.3.2", "xterm": "^4.5.0", "xterm-addon-fit": "^0.3.0", @@ -101,18 +102,19 @@ "node": "12.13.0" }, "devDependencies": { - "@angular-builders/custom-webpack": "^9.1.0", - "@angular-devkit/architect": "^0.901.7", - "@angular-devkit/build-angular": "^0.901.12", - "@angular-devkit/build-ng-packagr": "~0.901.5", - "@angular-devkit/core": "^9.1.7", - "@angular-devkit/schematics": "^9.1.5", - "@angular/cli": "^9.1.5", - "@angular/compiler-cli": "^9.1.6", - "@angular/language-service": "^9.1.6", + "@angular-builders/custom-webpack": "^10.0.1", + "@angular-devkit/architect": "^0.1002.0", + "@angular-devkit/build-angular": "^0.1002.0", + "@angular-devkit/build-ng-packagr": "~0.1002.0", + "@angular-devkit/core": "^10.2.0", + "@angular-devkit/schematics": "^10.2.0", + "@angular/cli": "^10.2.0", + "@angular/compiler-cli": "^10.2.0", + "@angular/language-service": "^10.2.0", "@schematics/angular": "^9.1.5", "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", + "@types/js-yaml": "^3.12.5", "@types/karma": "^5.0.0", "@types/node": "^13.11.1", "@types/request": "^2.48.4", @@ -120,10 +122,10 @@ "adm-zip": "^0.4.16", "browserstack-local": "^1.4.5", "codecov": "^3.7.1", - "codelyzer": "^5.1.2", + "codelyzer": "^6.0.1", "copy-webpack-plugin": "^6.2.0", "delete": "^1.1.0", - "fs-extra": "^9.0.0", + "fs-extra": "^9.0.1", "globby": "^11.0.0", "istanbul": "^0.4.5", "istanbul-api": "2.1.6", @@ -131,7 +133,7 @@ "jasmine-core": "~3.5.0", "jasmine-protractor-browser-log-reporter": "cf-stratos/jasmine-protractor-browser-log-reporter", "jasmine-spec-reporter": "~5.0.1", - "js-yaml": "~3.13.1", + "js-yaml": "~3.14.0", "json-schema-to-typescript": "^9.1.0", "karma": "~5.0.1", "karma-chrome-launcher": "~3.1.0", @@ -141,10 +143,9 @@ "karma-jasmine-html-reporter": "^1.5.3", "karma-spec-reporter": "0.0.32", "kind-of": "^6.0.3", - "lodash": "^4.17.19", "mem": "6.1.0", "mktemp": "^1.0.0", - "ng-packagr": "^9.1.1", + "ng-packagr": "^10.1.2", "npm-run-all": "^4.1.5", "nyc": "^15.1.0", "protractor": "^5.4.3", @@ -156,7 +157,7 @@ "sass-lint": "^1.12.1", "stratos-protractor-reporter": "^1.2.3", "ts-node": "^8.8.2", - "tslint": "~6.1.1", - "typescript": "3.8.3" + "tslint": "~6.1.0", + "typescript": "4.0.5" } } diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts index d327f4bf5b..55d26acc8e 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts @@ -120,7 +120,7 @@ export class EditAutoscalerCredentialComponent implements OnInit, OnDestroy { ...creds, authHeader: 'basic ' + btoa(`${creds.username}:${creds.password}`), fullUrl: `${creds.url}/v1/apps/${creds.app_id}/metrics` - } + }; }), publishReplay(1), refCount() diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-base-step.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-base-step.ts index caf16f5694..a4d28a3ea1 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-base-step.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-base-step.ts @@ -1,4 +1,4 @@ -import { OnInit } from '@angular/core'; +import { Directive, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Observable, of } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -7,7 +7,8 @@ import { StepOnNextFunction } from '../../../../core/src/shared/components/stepp import { AppAutoscalerPolicy, AppAutoscalerPolicyLocal } from '../../store/app-autoscaler.types'; import { EditAutoscalerPolicyService } from './edit-autoscaler-policy-service'; -export abstract class EditAutoscalerPolicy implements OnInit { +@Directive() +export abstract class EditAutoscalerPolicyDirective implements OnInit { public currentPolicy: AppAutoscalerPolicyLocal; public appAutoscalerPolicy$: Observable; protected isCreate = false; @@ -31,5 +32,5 @@ export abstract class EditAutoscalerPolicy implements OnInit { onNext: StepOnNextFunction = () => { this.service.setState(this.currentPolicy); return of({ success: true }); - } + }; } diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.ts index 1ff96089b9..3437024abe 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.ts @@ -11,7 +11,7 @@ import { StepOnNextFunction } from '../../../../../core/src/shared/components/st import { autoscalerTransformArrayToMap } from '../../../core/autoscaler-helpers/autoscaler-transform-policy'; import { PolicyAlert } from '../../../core/autoscaler-helpers/autoscaler-util'; import { numberWithFractionOrExceedRange } from '../../../core/autoscaler-helpers/autoscaler-validation'; -import { EditAutoscalerPolicy } from '../edit-autoscaler-policy-base-step'; +import { EditAutoscalerPolicyDirective } from '../edit-autoscaler-policy-base-step'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; @Component({ @@ -22,7 +22,7 @@ import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher } ] }) -export class EditAutoscalerPolicyStep1Component extends EditAutoscalerPolicy implements OnInit { +export class EditAutoscalerPolicyStep1Component extends EditAutoscalerPolicyDirective implements OnInit { policyAlert = PolicyAlert; timezoneOptions = moment.tz.names(); @@ -68,10 +68,10 @@ export class EditAutoscalerPolicyStep1Component extends EditAutoscalerPolicy imp this.currentPolicy.schedules.timezone = this.editLimitForm.get('timezone').value; this.service.setState(this.currentPolicy); return observableOf({ success: true }); - } + }; validateGlobalLimitMin(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = this.editLimitForm ? numberWithFractionOrExceedRange(control.value, 1, this.editLimitForm.get('instance_max_count').value - 1, true) : false; const lastValid = this.editLimitValid; @@ -84,7 +84,7 @@ export class EditAutoscalerPolicyStep1Component extends EditAutoscalerPolicy imp } validateGlobalLimitMax(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = this.editLimitForm ? numberWithFractionOrExceedRange(control.value, this.editLimitForm.get('instance_min_count').value + 1, Number.MAX_VALUE, true) : false; const lastValid = this.editLimitValid; diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.ts index 3c4df6dc89..05c2a6591b 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.ts @@ -20,7 +20,7 @@ import { numberWithFractionOrExceedRange, } from '../../../core/autoscaler-helpers/autoscaler-validation'; import { AppAutoscalerInvalidPolicyError, AppAutoscalerPolicyLocal } from '../../../store/app-autoscaler.types'; -import { EditAutoscalerPolicy } from '../edit-autoscaler-policy-base-step'; +import { EditAutoscalerPolicyDirective } from '../edit-autoscaler-policy-base-step'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; @Component({ @@ -31,7 +31,7 @@ import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher } ] }) -export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy implements OnInit, OnDestroy { +export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicyDirective implements OnInit, OnDestroy { policyAlert = PolicyAlert; metricTypes = AutoscalerConstants.MetricTypes; @@ -83,14 +83,14 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp this.filteredMetricTypes$ = this.editTriggerForm.controls.metric_type.valueChanges.pipe( startWith(''), map(value => this.metricTypes.filter(type => type.toLocaleLowerCase().includes(value))) - ) + ); } addTrigger = () => { const { ...newTrigger } = AutoscalerConstants.PolicyDefaultTrigger; this.currentPolicy.scaling_rules_form.push(newTrigger); this.editTrigger(this.currentPolicy.scaling_rules_form.length - 1); - } + }; removeTrigger(index: number) { if (this.editIndex === index) { @@ -143,7 +143,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerMetricType(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (!this.editTriggerForm) { return null; } @@ -158,7 +158,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerOperator(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (this.editTriggerForm) { this.editScaleType = getScaleType(control.value); this.editTriggerForm.controls.threshold.updateValueAndValidity(); @@ -168,7 +168,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerThreshold(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (!this.editTriggerForm) { return null; } @@ -188,7 +188,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerAdjustment(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (!this.editTriggerForm) { return null; } @@ -202,7 +202,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp } validateTriggerAdjustmentType(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (this.editTriggerForm) { this.editAdjustmentType = control.value; this.editTriggerForm.controls.adjustment.updateValueAndValidity(); diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.ts index a8d47f628b..3c6f533784 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.ts @@ -13,7 +13,7 @@ import { timeIsSameOrAfter, } from '../../../core/autoscaler-helpers/autoscaler-validation'; import { AppAutoscalerInvalidPolicyError, AppAutoscalerPolicyLocal } from '../../../store/app-autoscaler.types'; -import { EditAutoscalerPolicy } from '../edit-autoscaler-policy-base-step'; +import { EditAutoscalerPolicyDirective } from '../edit-autoscaler-policy-base-step'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; import { validateRecurringSpecificMax, @@ -28,7 +28,7 @@ import { { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher } ] }) -export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy implements OnInit { +export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicyDirective implements OnInit { policyAlert = PolicyAlert; weekdayOptions = AutoscalerConstants.WeekdayOptions; @@ -71,7 +71,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp const { ...newSchedule } = AutoscalerConstants.PolicyDefaultRecurringSchedule; this.currentPolicy.schedules.recurring_schedule.push(newSchedule); this.editRecurringSchedule(this.currentPolicy.schedules.recurring_schedule.length - 1); - } + }; removeRecurringSchedule(index: number) { if (this.editIndex === index) { @@ -160,7 +160,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp } validateRecurringScheduleGlobal(controlName?: string): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (this.editRecurringScheduleForm) { if (controlName === 'repeat_type') { this.editRepeatType = control.value; @@ -177,7 +177,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp } validateRecurringScheduleInitialMin(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = this.editRecurringScheduleForm && numberWithFractionOrExceedRange(control.value, this.editRecurringScheduleForm.get('instance_min_count').value, this.editRecurringScheduleForm.get('instance_max_count').value + 1, false); @@ -186,7 +186,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp } validateRecurringScheduleDate(mutualName: string): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (this.editEffectiveType === 'always') { return null; } @@ -206,7 +206,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp } validateRecurringScheduleTime(mutualName: string): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = this.editRecurringScheduleForm && timeIsSameOrAfter(this.editRecurringScheduleForm.get('start_time').value, this.editRecurringScheduleForm.get('end_time').value); const lastValid = this.editMutualValidation.time; @@ -217,7 +217,7 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp } validateRecurringScheduleWeekMonth(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const newSchedule: any = { start_time: this.editRecurringScheduleForm.get('start_time').value, end_time: this.editRecurringScheduleForm.get('end_time').value diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.ts index 3050f2caad..f0f42fdc32 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.ts @@ -25,7 +25,7 @@ import { AppAutoscalerPolicyLocal, AppSpecificDate, } from '../../../store/app-autoscaler.types'; -import { EditAutoscalerPolicy } from '../edit-autoscaler-policy-base-step'; +import { EditAutoscalerPolicyDirective } from '../edit-autoscaler-policy-base-step'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; @Component({ @@ -36,7 +36,7 @@ import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher } ] }) -export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy implements OnInit { +export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicyDirective implements OnInit { policyAlert = PolicyAlert; editSpecificDateForm: FormGroup; @@ -102,9 +102,9 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp })), first(), ); - } + }; - private getStateResult(info: RequestInfoState): { error: boolean, message: string } { + private getStateResult(info: RequestInfoState): { error: boolean, message: string, } { if (this.isCreate) { return { error: info.error, @@ -129,7 +129,7 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp const { ...newSchedule } = AutoscalerConstants.PolicyDefaultSpecificDate; this.currentPolicy.schedules.specific_date.push(newSchedule); this.editSpecificDate(this.currentPolicy.schedules.specific_date.length - 1); - } + }; removeSpecificDate(index: number) { if (this.editIndex === index) { @@ -170,7 +170,7 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp } validateSpecificDateInitialMin(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = this.editSpecificDateForm && numberWithFractionOrExceedRange(control.value, this.editSpecificDateForm.get('instance_min_count').value, this.editSpecificDateForm.get('instance_max_count').value + 1, false); return invalid ? { alertInvalidPolicyInitialMaximumRange: { value: control.value } } : null; @@ -178,7 +178,7 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp } validateSpecificDateStartDateTime(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (!this.editSpecificDateForm) { return null; } @@ -211,7 +211,7 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp } validateSpecificDateEndDateTime(): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { if (!this.editSpecificDateForm) { return null; } @@ -251,7 +251,7 @@ export class EditAutoscalerPolicyStep4Component extends EditAutoscalerPolicy imp } export function validateRecurringSpecificMin(editForm, editMutualValidation): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = editForm && numberWithFractionOrExceedRange(control.value, 1, editForm.get('instance_max_count').value - 1, true); const lastValid = editMutualValidation.limit; @@ -267,7 +267,7 @@ export function validateRecurringSpecificMin(editForm, editMutualValidation): Va } export function validateRecurringSpecificMax(editForm, editMutualValidation): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { + return (control: AbstractControl): { [key: string]: any, } => { const invalid = editForm && numberWithFractionOrExceedRange(control.value, editForm.get('instance_min_count').value + 1, Number.MAX_VALUE, true); const lastValid = editMutualValidation.limit; diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/app-autoscaler-metric-chart-card.component.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/app-autoscaler-metric-chart-card.component.ts index 975c4b8828..a4523f0b39 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/app-autoscaler-metric-chart-card.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/app-autoscaler-metric-chart-card.component.ts @@ -62,6 +62,7 @@ export class AppAutoscalerMetricChartCardComponent extends CardCell) { + super.row = row; if (row) { if (row.entity.query && row.entity.query.params) { this.paramsMetricsStart = row.entity.query.params.start * 1000; diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts index 4e71099074..a4b5d860bb 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts @@ -1,4 +1,3 @@ -import { IOrgFavMetadata } from '../../../cloud-foundry/src/cf-metadata-types'; import { StratosBaseCatalogEntity, StratosCatalogEntity, @@ -114,5 +113,5 @@ function generateMetricEntity(endpointDefinition: IStratosEndpointDefinition) { labelPlural: 'Autoscaler Metrics', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>(definition); + return new StratosCatalogEntity>(definition); } diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.store.module.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.store.module.ts deleted file mode 100644 index ccb391a42f..0000000000 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.store.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -// import { NgModule } from '@angular/core'; - -// import { CoreModule } from '../../../core/src/core/core.module'; -// import { StratosExtension } from '../../../core/src/core/extension/extension-service'; -// import { ExtensionEntitySchema } from '../../../core/src/core/extension/extension-types'; -// import { getAPIResourceGuid } from '../../../store/src/selectors/api.selectors'; - -// export const appAutoscalerHealthSchemaKey = 'autoscalerHealth'; -// export const appAutoscalerInfoSchemaKey = 'autoscalerInfo'; -// export const appAutoscalerPolicySchemaKey = 'autoscalerPolicy'; -// export const appAutoscalerPolicyTriggerSchemaKey = 'autoscalerPolicyTrigger'; -// export const appAutoscalerScalingHistorySchemaKey = 'autoscalerScalingHistory'; -// export const appAutoscalerAppMetricSchemaKey = 'autoscalerAppMetric'; - -// export const autoscalerEntities: ExtensionEntitySchema[] = [ -// { -// entityKey: appAutoscalerInfoSchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// { -// entityKey: appAutoscalerPolicySchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// { -// entityKey: appAutoscalerPolicyTriggerSchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// { -// entityKey: appAutoscalerHealthSchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// { -// entityKey: appAutoscalerScalingHistorySchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// { -// entityKey: appAutoscalerAppMetricSchemaKey, -// definition: {}, -// options: { idAttribute: getAPIResourceGuid } -// }, -// ]; - -// @StratosExtension({ -// entities: autoscalerEntities, -// }) -// @NgModule({ -// imports: [ -// CoreModule -// ] -// }) -// export class AutoscalerStoreModule { } diff --git a/src/frontend/packages/cloud-foundry/package.json b/src/frontend/packages/cloud-foundry/package.json index 2762a0873e..512391fb7b 100644 --- a/src/frontend/packages/cloud-foundry/package.json +++ b/src/frontend/packages/cloud-foundry/package.json @@ -3,12 +3,13 @@ "version": "0.0.1", "peerDependencies": { "@angular/common": "^6.0.0-rc.0 || ^6.0.0", - "@angular/core": "^6.0.0-rc.0 || ^6.0.0" + "@angular/core": "^6.0.0-rc.0 || ^6.0.0", + "@stratosui/git": "^0.0.1" }, "stratos": { "module": "CloudFoundryPackageModule", "routingModule": "CloudFoundryRoutingModule", "theming": "sass/_all-theme#apply-theme-stratos-cloud-foundry", - "backend": [ "cloudfoundry", "cfapppush", "cfappssh", "userinvite" ] + "backend": ["cloudfoundry", "cfapppush", "cfappssh", "userinvite"] } } diff --git a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts index c1cbe2a808..37a1a2a579 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts @@ -51,7 +51,7 @@ export class GetAllApplications extends CFStartAction implements PaginatedAction 'GET', 'apps' ); - this.paginationKey = this.paginationKey || createEntityRelationPaginationKey('cf', endpointGuid) + this.paginationKey = this.paginationKey || createEntityRelationPaginationKey('cf', endpointGuid); } actions = [GET_ALL, GET_ALL_SUCCESS, GET_ALL_FAILED]; entity = [applicationEntitySchema]; @@ -151,7 +151,7 @@ export class UpdateExistingApplication extends CFStartAction implements ICFActio ...keepFromOld }; return newEntities; - } + }; } export class DeleteApplication extends CFStartAction implements ICFAction { diff --git a/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts index 17c35c2e7f..b22e53da80 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts @@ -1,24 +1,15 @@ import { Action } from '@ngrx/store'; +import { GitBranch, GitSCM } from '@stratosui/git'; -import { PaginatedAction } from '../../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { gitBranchesEntityType, gitCommitEntityType } from '../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { GitSCM } from '../shared/data-services/scm/scm'; import { DockerAppDetails, GitAppDetails, OverrideAppDetails, SourceType } from '../store/types/deploy-application.types'; -import { GitBranch, GitCommit } from '../store/types/git.types'; export const SET_APP_SOURCE_DETAILS = '[Deploy App] Application Source'; export const CHECK_PROJECT_EXISTS = '[Deploy App] Check Project exists'; export const PROJECT_DOESNT_EXIST = '[Deploy App] Project Doesn\'t exist'; export const PROJECT_FETCH_FAILED = '[Deploy App] Project Fetch Failed'; export const PROJECT_EXISTS = '[Deploy App] Project exists'; -export const FETCH_BRANCHES_FOR_PROJECT = '[Deploy App] Fetch branches'; -export const FETCH_BRANCH_FOR_PROJECT = '[Deploy App] Fetch branch'; export const SAVE_APP_DETAILS = '[Deploy App] Save app details'; export const SAVE_APP_OVERRIDE_DETAILS = '[Deploy App] Save app override details'; -export const FETCH_COMMIT = '[Deploy App] Fetch commit'; -export const FETCH_COMMITS = '[Deploy App] Fetch commits'; export const SET_DEPLOY_CF_SETTINGS = '[Deploy App] Set CF Settings'; export const DELETE_DEPLOY_APP_SECTION = '[Deploy App] Delete section'; export const SET_BRANCH = '[Deploy App] Set branch'; @@ -26,14 +17,6 @@ export const SET_DEPLOY_BRANCH = '[Deploy App] Set deploy branch'; export const SET_DEPLOY_COMMIT = '[Deploy App] Set deploy commit'; export const DELETE_COMMIT = '[Deploy App] Delete commit'; -export const FETCH_BRANCH_START = '[GitHub] Fetch branch start'; -export const FETCH_BRANCH_SUCCESS = '[GitHub] Fetch branch succeeded'; -export const FETCH_BRANCH_FAILED = '[GitHub] Fetch branch failed'; - -export const FETCH_BRANCHES_START = '[GitHub] Fetch branches start'; -export const FETCH_BRANCHES_SUCCESS = '[GitHub] Fetch branches succeeded'; -export const FETCH_BRANCHES_FAILED = '[GitHub] Fetch branches failed'; - export class SetAppSourceDetails implements Action { constructor(public sourceType: SourceType) { } type = SET_APP_SOURCE_DETAILS; @@ -59,38 +42,6 @@ export class ProjectExists implements Action { type = PROJECT_EXISTS; } -export class FetchBranchForProject implements EntityRequestAction { - constructor(public scm: GitSCM, public projectName: string, public guid: string, public branchName: string) { - this.guid = this.guid || `${scm.getType()}-${this.projectName}-${this.branchName}` - } - actions = [ - FETCH_BRANCH_START, - FETCH_BRANCH_SUCCESS, - FETCH_BRANCH_FAILED - ]; - public endpointType = CF_ENDPOINT_TYPE; - type = FETCH_BRANCH_FOR_PROJECT; - entityType = gitBranchesEntityType; -} - -export class FetchBranchesForProject implements PaginatedAction { - constructor(public scm: GitSCM, public projectName: string) { - this.paginationKey = FetchBranchesForProject.createPaginationKey(scm, projectName); - } - actions = [ - FETCH_BRANCHES_START, - FETCH_BRANCHES_SUCCESS, - FETCH_BRANCHES_FAILED - ]; - public endpointType = CF_ENDPOINT_TYPE; - type = FETCH_BRANCHES_FOR_PROJECT; - entityType = gitBranchesEntityType; - paginationKey: string; - flattenPagination = true; - - static createPaginationKey = (scm: GitSCM, projectName: string) => scm.getType() + ':' + projectName; -} - export class SaveAppDetails implements Action { constructor(public git: GitAppDetails, public docker: DockerAppDetails) { } type = SAVE_APP_DETAILS; @@ -101,39 +52,6 @@ export class SaveAppOverrides implements Action { type = SAVE_APP_OVERRIDE_DETAILS; } -export class FetchCommit implements EntityRequestAction { - commit: GitCommit; - public endpointType = CF_ENDPOINT_TYPE; - constructor(public scm: GitSCM, public commitSha: string, public projectName: string) { } - type = FETCH_COMMIT; - entityType = gitCommitEntityType; -} - -export class FetchCommits implements PaginatedAction { - - /** - * Creates an instance of FetchCommits. - * @param projectName For example `cloudfoundry-incubator/stratos` - * @param sha Branch name, tag, etc - */ - constructor(public scm: GitSCM, public projectName: string, public sha: string) { - this.paginationKey = scm.getType() + projectName + sha; - } - actions = [ - '[Deploy App] Fetch commits start', - '[Deploy App] Fetch commits success', - '[Deploy App] Fetch commits failed', - ]; - public endpointType = CF_ENDPOINT_TYPE; - type = FETCH_COMMITS; - entityType = gitCommitEntityType; - paginationKey: string; - initialParams = { - 'order-direction': 'asc', - 'order-direction-field': 'date', - }; -} - export class StoreCFSettings implements Action { constructor(public cloudFoundryDetails: any) { } type = SET_DEPLOY_CF_SETTINGS; diff --git a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts deleted file mode 100644 index c02111909b..0000000000 --- a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { gitRepoEntityType } from '../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { GitMeta } from '../entity-action-builders/git-action-builder'; - -export const FETCH_GITHUB_REPO = '[Github] Fetch Github repo details'; - -export class FetchGitHubRepoInfo implements EntityRequestAction { - constructor(public meta: GitMeta) { - this.guid = this.meta.scm.getType() + '-' + this.meta.projectName; - } - type = FETCH_GITHUB_REPO; - endpointType = CF_ENDPOINT_TYPE; - entityType = gitRepoEntityType; - public guid: string; -} diff --git a/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts b/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts index f268cc8926..898ae3f343 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts @@ -32,4 +32,4 @@ export class CfValidateEntitiesComplete implements Action { ) { } -} \ No newline at end of file +} diff --git a/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts index b0e98b2aeb..9fc542c81a 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts @@ -196,7 +196,7 @@ export class ListServiceBindingsForInstance ); this.initialParams.q = [ new QParam('service_instance_guid', serviceInstanceGuid, QParamJoiners.in).toString(), - ] + ]; } actions = getActions('Service Instances', 'Get all service bindings for instance'); entity = [cfEntityFactory(serviceBindingNoBindingsEntityType)]; diff --git a/src/frontend/packages/cloud-foundry/src/cf-api.types.ts b/src/frontend/packages/cloud-foundry/src/cf-api.types.ts index 0449db54d5..1fb68ae4c9 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-api.types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-api.types.ts @@ -361,7 +361,7 @@ export interface CfEvent { actee_type: string; actee_name: string; timestamp: string; - metadata: { [name: string]: any }; + metadata: { [name: string]: any, }; space_guid?: string; organization_guid?: string; } @@ -381,4 +381,4 @@ export enum CFFeatureFlagTypes { space_scoped_private_broker_creation = 'space_scoped_private_broker_creation', space_developer_env_var_visibility = 'space_developer_env_var_visibility', service_instance_sharing = 'service_instance_sharing', -} \ No newline at end of file +} diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts index a3db99e684..53317cbeb9 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts @@ -3,6 +3,7 @@ import { StratosCatalogEndpointEntity, } from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { APIResource } from '../../store/src/types/api.types'; +import { IFavoriteMetadata } from '../../store/src/types/user-favorites.types'; import { IService, IServiceBinding, @@ -29,7 +30,7 @@ import { ISpaceQuotaDefinition, IStack, } from './cf-api.types'; -import { IAppFavMetadata, IBasicCFMetaData, IOrgFavMetadata, ISpaceFavMetadata } from './cf-metadata-types'; +import { ISpaceFavMetadata } from './cf-metadata-types'; import { AppEnvVarActionBuilders } from './entity-action-builders/application-env-var.action-builders'; import { AppStatsActionBuilders } from './entity-action-builders/application-stats.action-builders'; import { AppSummaryActionBuilders } from './entity-action-builders/application-summary.action-builders'; @@ -39,12 +40,6 @@ import { CfEventActionBuilders } from './entity-action-builders/cf-event.action- import { CfInfoDefinitionActionBuilders } from './entity-action-builders/cf-info.action-builders'; import { DomainActionBuilders } from './entity-action-builders/domin.action-builder'; import { FeatureFlagActionBuilders } from './entity-action-builders/feature-flag.action-builder'; -import { - GitBranchActionBuilders, - GitCommitActionBuilders, - GitCommitActionBuildersConfig, - GitRepoActionBuilders, -} from './entity-action-builders/git-action-builder'; import { OrganizationActionBuilders } from './entity-action-builders/organization.action-builders'; import { QuotaDefinitionActionBuilder } from './entity-action-builders/quota-definition.action-builders'; import { RoutesActionBuilders } from './entity-action-builders/routes.action-builder'; @@ -62,7 +57,6 @@ import { UserProvidedServiceActionBuilder } from './entity-action-builders/user- import { UserActionBuilders } from './entity-action-builders/user.action-builders'; import { AppStat } from './store/types/app-metadata.types'; import { CfUser } from './store/types/cf-user.types'; -import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; /** * A strongly typed collection of Cloud Foundry Catalog Entities. @@ -72,151 +66,132 @@ export class CfEntityCatalog { public cfEndpoint: StratosCatalogEndpointEntity; public quotaDefinition: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, QuotaDefinitionActionBuilder >; public appEnvVar: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, AppEnvVarActionBuilders >; public appSummary: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, IAppSummary, AppSummaryActionBuilders >; public spaceQuota: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, SpaceQuotaDefinitionActionBuilders >; public privateDomain: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource >; public cfInfo: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, CfInfoDefinitionActionBuilders >; public appStats: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, AppStat, AppStatsActionBuilders >; public buildPack: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, BuildpackActionBuilders >; public serviceBroker: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceBrokerActionBuilders >; public servicePlanVisibility: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServicePlanVisibilityActionBuilders >; public securityGroup: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, SecurityGroupBuilders >; public serviceBinding: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceBindingActionBuilders >; public service: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceActionBuilders >; public servicePlan: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServicePlanActionBuilders >; public serviceInstance: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceInstanceActionBuilders >; public user: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, UserActionBuilders >; public domain: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, DomainActionBuilders >; - public gitCommit: StratosBaseCatalogEntity< - IBasicCFMetaData, - GitCommit, - GitCommitActionBuildersConfig, - GitCommitActionBuilders - >; - - public gitRepo: StratosBaseCatalogEntity< - IBasicCFMetaData, - GitRepo, - GitRepoActionBuilders - >; - - public gitBranch: StratosBaseCatalogEntity< - IBasicCFMetaData, - GitBranch, - GitBranchActionBuilders - >; - public event: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, CfEventActionBuilders >; public route: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, RoutesActionBuilders >; public stack: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, StackActionBuilders >; public featureFlag: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, IFeatureFlag, FeatureFlagActionBuilders >; public application: StratosBaseCatalogEntity< - IAppFavMetadata, + IFavoriteMetadata, APIResource, ApplicationActionBuilders >; @@ -228,17 +203,17 @@ export class CfEntityCatalog { >; public org: StratosBaseCatalogEntity< - IOrgFavMetadata, + IFavoriteMetadata, APIResource, OrganizationActionBuilders >; public metric: StratosBaseCatalogEntity< - IBasicCFMetaData + IFavoriteMetadata >; public userProvidedService: StratosBaseCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, UserProvidedServiceActionBuilder >; diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts index 33bbedf4f7..49487cbdfc 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts @@ -22,9 +22,6 @@ import { cfUserEntityType, domainEntityType, featureFlagEntityType, - gitBranchesEntityType, - gitCommitEntityType, - gitRepoEntityType, organizationEntityType, privateDomainsEntityType, quotaDefinitionEntityType, @@ -49,7 +46,7 @@ import { getAPIResourceGuid } from './store/selectors/api.selectors'; import { CfUser, CfUserRoleParams, OrgUserRoleNames, SpaceUserRoleNames } from './store/types/cf-user.types'; const entityCache: { - [key: string]: EntitySchema + [key: string]: EntitySchema; } = {}; const AppSummarySchema = new CFEntitySchema(appSummaryEntityType, {}, { idAttribute: 'guid' }); @@ -61,15 +58,6 @@ entityCache[appStatsEntityType] = AppStatSchema; const AppEnvVarSchema = new CFEntitySchema(appEnvVarsEntityType, {}, { idAttribute: getAPIResourceGuid }); entityCache[appEnvVarsEntityType] = AppEnvVarSchema; -const GithubBranchSchema = new CFEntitySchema(gitBranchesEntityType, {}, { idAttribute: 'entityId' }); -entityCache[gitBranchesEntityType] = GithubBranchSchema; - -const GithubRepoSchema = new CFEntitySchema(gitRepoEntityType); -entityCache[gitRepoEntityType] = GithubRepoSchema; - -const GithubCommitSchema = new CFEntitySchema(gitCommitEntityType, {}, { idAttribute: commit => commit.guid }); -entityCache[gitCommitEntityType] = GithubCommitSchema; - const CFInfoSchema = new CFEntitySchema(cfInfoEntityType); entityCache[cfInfoEntityType] = CFInfoSchema; diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts index 20e226cbd5..442e342b7d 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts @@ -1,5 +1,6 @@ +import { Compiler, Injector } from '@angular/core'; import { Action, Store } from '@ngrx/store'; -import moment from 'moment'; +import { entityFetchedWithoutError } from '@stratosui/store'; import { combineLatest, Observable, of } from 'rxjs'; import { first, map } from 'rxjs/operators'; @@ -27,6 +28,7 @@ import { selectSessionData } from '../../store/src/reducers/auth.reducer'; import { APIResource, EntityInfo } from '../../store/src/types/api.types'; import { PaginatedAction, PaginationEntityState } from '../../store/src/types/pagination.types'; import { ICFAction } from '../../store/src/types/request.types'; +import { IFavoriteMetadata } from '../../store/src/types/user-favorites.types'; import { CfValidateEntitiesStart } from './actions/relations-actions'; import { IService, @@ -67,9 +69,6 @@ import { cfUserEntityType, domainEntityType, featureFlagEntityType, - gitBranchesEntityType, - gitCommitEntityType, - gitRepoEntityType, organizationEntityType, privateDomainsEntityType, quotaDefinitionEntityType, @@ -91,8 +90,7 @@ import { userProvidedServiceInstanceEntityType, } from './cf-entity-types'; import { CfErrorResponse, getCfError } from './cf-error-helpers'; -import { getFavoriteFromCfEntity } from './cf-favorites-helpers'; -import { IAppFavMetadata, IBasicCFMetaData, IOrgFavMetadata, ISpaceFavMetadata } from './cf-metadata-types'; +import { ISpaceFavMetadata } from './cf-metadata-types'; import { CF_ENDPOINT_TYPE } from './cf-types'; import { AppEnvVarActionBuilders, @@ -112,16 +110,6 @@ import { } from './entity-action-builders/cf-info.action-builders'; import { DomainActionBuilders, domainActionBuilders } from './entity-action-builders/domin.action-builder'; import { FeatureFlagActionBuilders, featureFlagActionBuilders } from './entity-action-builders/feature-flag.action-builder'; -import { - GitBranchActionBuilders, - gitBranchActionBuilders, - GitCommitActionBuilders, - gitCommitActionBuilders, - GitCommitActionBuildersConfig, - GitMeta, - GitRepoActionBuilders, - gitRepoActionBuilders, -} from './entity-action-builders/git-action-builder'; import { OrganizationActionBuilders, organizationActionBuilders, @@ -175,9 +163,8 @@ import { routeReducer, updateAppSummaryRoutesReducer } from './store/reducers/ro import { serviceInstanceReducer } from './store/reducers/service-instance.reducer'; import { updateSpaceQuotaReducer } from './store/reducers/space-quota.reducer'; import { AppStat } from './store/types/app-metadata.types'; -import { CFResponse } from './store/types/cf-api.types'; +import { CfAPIResource, CFResponse } from './store/types/cf-api.types'; import { CfUser } from './store/types/cf-user.types'; -import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; import { cfUserRolesFetch } from './user-permissions/cf-user-roles-fetch'; function safePopulatePaginationFromParent(store: Store, action: PaginatedAction): Observable { @@ -236,6 +223,33 @@ export interface CFBasePipelineRequestActionMeta { flatten?: boolean; } +function cfShortcuts(id: string) { + return [ + { + title: 'View Organizations', + link: ['/cloud-foundry', id, 'organizations'], + icon: 'organization', + iconFont: 'stratos-icons' + }, + { + title: 'View Applications', + link: ['/applications', id], + icon: 'apps' + }, + { + title: 'Deploy an Application', + link: ['/applications', 'new', id], + icon: 'publish' + }, + { + title: 'View Cloud Foundry Info', + link: ['/cloud-foundry', id], + icon: 'cloud_foundry', + iconFont: 'stratos-icons' + }, + ]; +} + export function generateCFEntities(): StratosBaseCatalogEntity[] { const endpointDefinition: StratosEndpointExtensionDefinition = { urlValidationRegexString: urlValidationExpression, @@ -246,10 +260,20 @@ export function generateCFEntities(): StratosBaseCatalogEntity[] { iconFont: 'stratos-icons', logoUrl: '/core/assets/endpoint-icons/cloudfoundry.png', authTypes: [BaseEndpointAuth.UsernamePassword, BaseEndpointAuth.SSO], + homeCard: { + component: (compiler: Compiler, injector: Injector) => import('./features/home/cfhome-card/cfhome-card.module').then(m => { + return compiler.compileModuleAndAllComponentsAsync(m.CFHomeCardModule).then(cm => { + const mod = cm.ngModuleFactory.create(injector); + return mod.instance.createHomeCard(mod.componentFactoryResolver); + }); + }), + shortcuts: cfShortcuts, + fullView: false, + }, listDetailsComponent: CfEndpointDetailsComponent, renderPriority: 1, healthCheck: new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => cfEntityCatalog.cfInfo.api.get(endpoint.guid)), - favoriteFromEntity: getFavoriteFromCfEntity, + getEndpointIdFromEntity: (entity: CfAPIResource) => entity.entity.cfGuid, globalPreRequest: (request, action) => { return addCfRelationParams(request, action); }, @@ -380,9 +404,6 @@ export function generateCFEntities(): StratosBaseCatalogEntity[] { generateStackEntity(endpointDefinition), generateRouteEntity(endpointDefinition), generateEventEntity(endpointDefinition), - generateGitBranchEntity(endpointDefinition), - generateGitRepoEntity(endpointDefinition), - generateGitCommitEntity(endpointDefinition), generateCFDomainEntity(endpointDefinition), generateCFUserEntity(endpointDefinition), generateCFServiceInstanceEntity(endpointDefinition), @@ -414,7 +435,7 @@ function generateCFQuotaDefinitionEntity(endpointDefinition: StratosEndpointExte labelPlural: 'Organization Quotas', }; cfEntityCatalog.quotaDefinition = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, QuotaDefinitionActionBuilder >(definition, { @@ -457,7 +478,7 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD labelPlural: 'App Env Vars', }; cfEntityCatalog.appEnvVar = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, AppEnvVarActionBuilders, AppEnvVarActionBuilders @@ -469,9 +490,8 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD entityBuilder: { getMetadata: ent => ({ name: `Application environment variables (${ent.metadata.guid}).`, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid }, }); return cfEntityCatalog.appEnvVar; @@ -485,7 +505,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension label: 'App Summary', labelPlural: 'App Summaries', }; - cfEntityCatalog.appSummary = new StratosCatalogEntity(definition, { + cfEntityCatalog.appSummary = new StratosCatalogEntity(definition, { dataReducers: [ updateAppSummaryRoutesReducer, endpointDisconnectRemoveEntitiesReducer() @@ -494,9 +514,8 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension entityBuilder: { getMetadata: ent => ({ name: ent.name, - guid: ent.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.guid, } }); return cfEntityCatalog.appSummary; @@ -511,7 +530,7 @@ function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtension labelPlural: 'Space Quotas', }; cfEntityCatalog.spaceQuota = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, SpaceQuotaDefinitionActionBuilders>(definition, { dataReducers: [ @@ -530,7 +549,7 @@ function generateCFPrivateDomainEntity(endpointDefinition: StratosEndpointExtens label: 'Private Domain', labelPlural: 'Private Domains', }; - cfEntityCatalog.privateDomain = new StratosCatalogEntity>(definition, { + cfEntityCatalog.privateDomain = new StratosCatalogEntity>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -546,7 +565,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Cloud Foundry Infos', endpoint: endpointDefinition }; - cfEntityCatalog.cfInfo = new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( + cfEntityCatalog.cfInfo = new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( cfInfoDefinition, { dataReducers: [ @@ -555,10 +574,9 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini actionBuilders: cfInfoDefinitionActionBuilders, entityBuilder: { getMetadata: info => ({ - guid: info.entity.name, name: info.entity.name, }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -574,7 +592,7 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos endpoint: endpointDefinition, }; cfEntityCatalog.userProvidedService = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, UserProvidedServiceActionBuilder >( @@ -588,9 +606,8 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos entityBuilder: { getMetadata: ent => ({ name: ent.entity.name, - guid: ent.metadata.guid, }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid }, } ); @@ -629,7 +646,7 @@ function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDe return data; }, }; - cfEntityCatalog.appStats = new StratosCatalogEntity(definition, { + cfEntityCatalog.appStats = new StratosCatalogEntity(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -637,9 +654,8 @@ function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDe entityBuilder: { getMetadata: ent => ({ name: ent.guid, - guid: ent.guid }), - getGuid: metadata => metadata.name, + getGuid: entity => entity.guid } }); return cfEntityCatalog.appStats; @@ -651,7 +667,7 @@ function generateCFBuildPackEntity(endpointDefinition: StratosEndpointExtensionD schema: cfEntityFactory(buildpackEntityType), endpoint: endpointDefinition }; - cfEntityCatalog.buildPack = new StratosCatalogEntity, BuildpackActionBuilders>(definition, { + cfEntityCatalog.buildPack = new StratosCatalogEntity, BuildpackActionBuilders>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -667,7 +683,7 @@ function generateCFServiceBrokerEntity(endpointDefinition: StratosEndpointExtens endpoint: endpointDefinition }; cfEntityCatalog.serviceBroker = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceBrokerActionBuilders>(definition, { dataReducers: [ @@ -685,7 +701,7 @@ function generateCFServicePlanVisibilityEntity(endpointDefinition: StratosEndpoi endpoint: endpointDefinition }; cfEntityCatalog.servicePlanVisibility = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServicePlanVisibilityActionBuilders >(definition, { @@ -706,7 +722,7 @@ function generateCFSecurityGroupEntity(endpointDefinition: StratosEndpointExtens endpoint: endpointDefinition }; cfEntityCatalog.securityGroup = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, SecurityGroupBuilders>(definition, { dataReducers: [ @@ -729,7 +745,7 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten endpoint: endpointDefinition }; cfEntityCatalog.serviceBinding = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceBindingActionBuilders >( @@ -742,9 +758,8 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten entityBuilder: { getMetadata: ent => ({ name: ent.metadata.guid, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -760,7 +775,7 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef endpoint: endpointDefinition }; cfEntityCatalog.service = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceActionBuilders >( @@ -773,9 +788,8 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef entityBuilder: { getMetadata: ent => ({ name: ent.entity.label, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid }, } ); @@ -791,7 +805,7 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio endpoint: endpointDefinition }; cfEntityCatalog.servicePlan = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServicePlanActionBuilders >( @@ -804,9 +818,8 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio entityBuilder: { getMetadata: ent => ({ name: ent.entity.name, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -826,7 +839,7 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte endpoint: endpointDefinition, }; cfEntityCatalog.serviceInstance = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, ServiceInstanceActionBuilders >( @@ -840,9 +853,8 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte entityBuilder: { getMetadata: ent => ({ name: ent.entity.name, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -857,7 +869,7 @@ function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Users', endpoint: endpointDefinition, }; - cfEntityCatalog.user = new StratosCatalogEntity, UserActionBuilders>( + cfEntityCatalog.user = new StratosCatalogEntity, UserActionBuilders>( definition, { actionBuilders: userActionBuilders, @@ -865,9 +877,8 @@ function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefini entityBuilder: { getMetadata: ent => ({ name: ent.entity.username || ent.entity.guid || ent.metadata.guid, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -883,7 +894,7 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi endpoint: endpointDefinition }; cfEntityCatalog.domain = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, DomainActionBuilders >( @@ -896,93 +907,15 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi entityBuilder: { getMetadata: ent => ({ name: ent.entity.name, - guid: ent.metadata.guid }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); return cfEntityCatalog.domain; } -function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: gitCommitEntityType, - schema: cfEntityFactory(gitCommitEntityType), - label: 'Git Commit', - labelPlural: 'Git Commits', - endpoint: endpointDefinition, - nonJetstreamRequest: true, - successfulRequestDataMapper: (data, endpointGuid, guid, entityType, endpointType, action) => { - const metadata = (action.metadata as GitMeta[])[0]; - return { - ...metadata.scm.convertCommit(metadata.projectName, data), - guid: action.guid - }; - }, - }; - cfEntityCatalog.gitCommit = new StratosCatalogEntity( - definition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: gitCommitActionBuilders, - entityBuilder: { - getMetadata: ent => ({ - name: ent.commit ? ent.commit.message || ent.sha : ent.sha, - guid: ent.guid - }), - getGuid: metadata => metadata.guid, - } - } - ); - return cfEntityCatalog.gitCommit; -} - -function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: gitRepoEntityType, - schema: cfEntityFactory(gitRepoEntityType), - label: 'Git Repository', - labelPlural: 'Git Repositories', - endpoint: endpointDefinition - }; - cfEntityCatalog.gitRepo = new StratosCatalogEntity< - IBasicCFMetaData, - GitRepo, - GitRepoActionBuilders - >( - definition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: gitRepoActionBuilders, - } - ); - return cfEntityCatalog.gitRepo; -} -function generateGitBranchEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - const definition: IStratosEntityDefinition = { - type: gitBranchesEntityType, - schema: cfEntityFactory(gitBranchesEntityType), - label: 'Git Branch', - labelPlural: 'Git Branches', - endpoint: endpointDefinition - }; - cfEntityCatalog.gitBranch = new StratosCatalogEntity( - definition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: gitBranchActionBuilders, - } - ); - return cfEntityCatalog.gitBranch; -} function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinition) { const definition: IStratosEntityDefinition = { @@ -993,7 +926,7 @@ function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinit endpoint: endpointDefinition }; cfEntityCatalog.event = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, CfEventActionBuilders>( definition, @@ -1005,11 +938,10 @@ function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinit entityBuilder: { getMetadata: event => { return { - guid: event.metadata.guid, name: event.metadata.guid, }; }, - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -1025,7 +957,7 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit endpoint: endpointDefinition }; cfEntityCatalog.route = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, RoutesActionBuilders >( @@ -1038,10 +970,9 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit ], entityBuilder: { getMetadata: app => ({ - guid: app.metadata.guid, name: app.entity.domain_url, }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -1057,7 +988,7 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit endpoint: endpointDefinition }; cfEntityCatalog.stack = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, APIResource, StackActionBuilders >( @@ -1069,10 +1000,9 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit actionBuilders: stackActionBuilders, entityBuilder: { getMetadata: app => ({ - guid: app.metadata.guid, name: app.entity.name, }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.metadata.guid } } ); @@ -1107,7 +1037,7 @@ function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionD } }; cfEntityCatalog.featureFlag = new StratosCatalogEntity< - IBasicCFMetaData, + IFavoriteMetadata, IFeatureFlag, FeatureFlagActionBuilders>( featureFlagDefinition, @@ -1118,10 +1048,9 @@ function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionD actionBuilders: featureFlagActionBuilders, entityBuilder: { getMetadata: ff => ({ - guid: ff.guid, name: ff.name, }), - getGuid: metadata => metadata.guid, + getGuid: entity => entity.guid, } } ); @@ -1131,7 +1060,7 @@ function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionD function generateCfEndpointEntity(endpointDefinition: StratosEndpointExtensionDefinition) { cfEntityCatalog.cfEndpoint = new StratosCatalogEndpointEntity( endpointDefinition, - metadata => `/cloud-foundry/${metadata.guid}` + favorite => `/cloud-foundry/${favorite.endpointId}` ); return cfEntityCatalog.cfEndpoint; } @@ -1153,7 +1082,7 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio }; cfEntityCatalog.application = new StratosCatalogEntity< - IAppFavMetadata, + IFavoriteMetadata, APIResource, ApplicationActionBuilders >( @@ -1165,16 +1094,11 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio ], entityBuilder: { getMetadata: app => ({ - guid: app.metadata.guid, - cfGuid: app.entity.cfGuid, - createdAt: moment(app.metadata.created_at).format('LLL'), name: app.entity.name, }), - getLink: metadata => `/applications/${metadata.cfGuid}/${metadata.guid}/summary`, - getGuid: metadata => metadata.guid, - getLines: () => ([ - ['Created', (meta) => meta.createdAt] - ]) + getLink: favorite => `/applications/${favorite.endpointId}/${favorite.entityId}/summary`, + getGuid: entity => entity.metadata.guid, + getIsValid: (fav) => cfEntityCatalog.application.api.get(fav.entityId, fav.endpointId, {}).pipe(entityFetchedWithoutError()) }, actionBuilders: applicationActionBuilder }, @@ -1206,17 +1130,12 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin ], entityBuilder: { getMetadata: space => ({ - guid: space.metadata.guid, orgGuid: space.entity.organization_guid ? space.entity.organization_guid : space.entity.organization.metadata.guid, name: space.entity.name, - cfGuid: space.entity.cfGuid, - createdAt: moment(space.metadata.created_at).format('LLL'), }), - getLines: () => ([ - ['Created', (meta) => meta.createdAt] - ]), - getLink: metadata => `/cloud-foundry/${metadata.cfGuid}/organizations/${metadata.orgGuid}/spaces/${metadata.guid}/summary`, - getGuid: metadata => metadata.guid + getLink: favorite => `/cloud-foundry/${favorite.endpointId}/organizations/${favorite.metadata.orgGuid}/spaces/${favorite.entityId}/summary`, + getGuid: entity => entity.metadata.guid, + getIsValid: (fav) => cfEntityCatalog.space.api.get(fav.entityId, fav.endpointId).pipe(entityFetchedWithoutError()) } } ); @@ -1234,7 +1153,7 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit iconFont: 'stratos-icons' }; cfEntityCatalog.org = new StratosCatalogEntity< - IOrgFavMetadata, + IFavoriteMetadata, APIResource, OrganizationActionBuilders >( @@ -1249,30 +1168,17 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit ], entityBuilder: { getMetadata: org => ({ - guid: org.metadata.guid, - status: getOrgStatus(org), name: org.entity.name, - cfGuid: org.entity.cfGuid, - createdAt: moment(org.metadata.created_at).format('LLL'), }), - getLink: metadata => `/cloud-foundry/${metadata.cfGuid}/organizations/${metadata.guid}`, - getLines: () => ([ - ['Created', (meta) => meta.createdAt] - ]), - getGuid: metadata => metadata.guid + getLink: favorite => `/cloud-foundry/${favorite.endpointId}/organizations/${favorite.entityId}`, + getGuid: entity => entity.metadata.guid, + getIsValid: (favorite) => cfEntityCatalog.org.api.get(favorite.entityId, favorite.endpointId, {}).pipe(entityFetchedWithoutError()) } } ); return cfEntityCatalog.org; } -function getOrgStatus(org: APIResource) { - if (!org || !org.entity || !org.entity.status) { - return 'Unknown'; - } - return org.entity.status.charAt(0).toUpperCase() + org.entity.status.slice(1); -} - function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinition) { const definition: IStratosEntityDefinition = { type: metricEntityType, @@ -1281,7 +1187,7 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio labelPlural: 'CF Metrics', endpoint: endpointDefinition, }; - cfEntityCatalog.metric = new StratosCatalogEntity( + cfEntityCatalog.metric = new StratosCatalogEntity( definition, { dataReducers: [ diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts index 4175b2d4e4..cec772d1d6 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts @@ -26,7 +26,6 @@ import { } from './cf-api.types'; import { AppStats } from './store/types/app-metadata.types'; import { CfUser } from './store/types/cf-user.types'; -import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; export const applicationEntityType = 'application'; export const stackEntityType = 'stack'; @@ -41,9 +40,6 @@ export const cfUserEntityType = 'user'; export const appSummaryEntityType = 'applicationSummary'; export const appStatsEntityType = 'applicationStats'; export const appEnvVarsEntityType = 'environmentVars'; -export const gitBranchesEntityType = 'gitBranches'; -export const gitRepoEntityType = 'gitRepo'; -export const gitCommitEntityType = 'gitCommits'; export const serviceEntityType = 'service'; export const serviceBindingEntityType = 'serviceBinding'; export const servicePlanEntityType = 'servicePlan'; @@ -70,9 +66,6 @@ interface CFEntityValues { cfOrganization: IRequestEntityTypeState>; cfRoute: IRequestEntityTypeState>; cfEvent: IRequestEntityTypeState; - cfGitBranches: IRequestEntityTypeState>; - cfGitRepo: IRequestEntityTypeState>; - cfGitCommits: IRequestEntityTypeState>; cfDomain: IRequestEntityTypeState>; cfUser: IRequestEntityTypeState>; cfServiceInstance: IRequestEntityTypeState>; diff --git a/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts b/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts deleted file mode 100644 index 8f19d39a21..0000000000 --- a/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IEntityMetadata } from '../../store/src/entity-catalog/entity-catalog.types'; -import { FavoritesConfigMapper } from '../../store/src/favorite-config-mapper'; -import { UserFavorite } from '../../store/src/types/user-favorites.types'; -import { CfAPIResource } from './store/types/cf-api.types'; - -export function getFavoriteFromCfEntity( - entity, - entityType: string, - favoritesConfigMapper: FavoritesConfigMapper -): UserFavorite { - if (isCfEntity(entity as CfAPIResource)) { - return favoritesConfigMapper.getFavoriteFromEntity( - entityType, - 'cf', - entity.entity.cfGuid, - entity - ); - } - return null; -} - -function isCfEntity(entity: CfAPIResource) { - return entity && entity.entity.cfGuid && entity.metadata && entity.metadata.guid; -} - diff --git a/src/frontend/packages/cloud-foundry/src/cf-metadata-types.ts b/src/frontend/packages/cloud-foundry/src/cf-metadata-types.ts index 5103014d69..f9beed8b62 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-metadata-types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-metadata-types.ts @@ -1,26 +1,5 @@ import { IFavoriteMetadata } from '../../store/src/types/user-favorites.types'; export interface ISpaceFavMetadata extends IFavoriteMetadata { - guid: string; orgGuid: string; - name: string; - cfGuid: string; -} - -export interface IOrgFavMetadata extends IFavoriteMetadata { - guid: string; - status: string; - name: string; - cfGuid: string; -} - -export interface IAppFavMetadata extends IFavoriteMetadata { - guid: string; - cfGuid: string; - name: string; -} - -export interface IBasicCFMetaData extends IFavoriteMetadata { - guid: string; - name: string; } diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry-package.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry-package.module.ts index 410bbe7b18..03e6f28654 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry-package.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry-package.module.ts @@ -8,7 +8,6 @@ import { generateCFEntities } from './cf-entity-generator'; import { CfUserService } from './shared/data-services/cf-user.service'; import { CloudFoundryService } from './shared/data-services/cloud-foundry.service'; import { LongRunningCfOperationsService } from './shared/data-services/long-running-cf-op.service'; -import { GitSCMService } from './shared/data-services/scm/scm.service'; import { ServiceActionHelperService } from './shared/data-services/service-action-helper.service'; import { CloudFoundryUserProvidedServicesService } from './shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundryStoreModule } from './store/cloud-foundry.store.module'; @@ -29,7 +28,6 @@ import { cfCurrentUserPermissionsService } from './user-permissions/cf-user-perm ServiceActionHelperService, LongRunningCfOperationsService, CloudFoundryUserProvidedServicesService, - GitSCMService, ] }) export class CloudFoundryPackageModule { } diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry-routing.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry-routing.module.ts index 61bfb111fb..e3ef0fd606 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry-routing.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry-routing.module.ts @@ -53,7 +53,7 @@ const customRoutes: Routes = [ } }, }, -] +]; @NgModule({ imports: [ @@ -61,4 +61,4 @@ const customRoutes: Routes = [ ], declarations: [] }) -export class CloudFoundryRoutingModule { } \ No newline at end of file +export class CloudFoundryRoutingModule { } diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts index 3df3235a19..1ae6031ddd 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts @@ -1,9 +1,9 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NgModule } from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; +import { getGitHubAPIURL, GITHUB_API_URL, GitSCMService } from '@stratosui/git'; import { generateASEntities } from '../../cf-autoscaler/src/store/autoscaler-entity-generator'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../core/src/core/github.helpers'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { generateStratosEntities } from '../../store/src/stratos-entity-generator'; @@ -13,7 +13,6 @@ import { generateCFEntities } from './cf-entity-generator'; import { ActiveRouteCfOrgSpace } from './features/cf/cf-page.types'; import { CfUserService } from './shared/data-services/cf-user.service'; import { LongRunningCfOperationsService } from './shared/data-services/long-running-cf-op.service'; -import { GitSCMService } from './shared/data-services/scm/scm.service'; import { CloudFoundryStoreModule } from './store/cloud-foundry.store.module'; @NgModule({ @@ -22,7 +21,8 @@ import { CloudFoundryStoreModule } from './store/cloud-foundry.store.module'; ngModule: EntityCatalogFeatureModule, providers: [ { - provide: CATALOGUE_ENTITIES, useFactory: () => { + provide: CATALOGUE_ENTITIES, + useFactory: () => { const testEntityCatalog = entityCatalog as TestEntityCatalog; testEntityCatalog.clear(); return [ @@ -30,7 +30,8 @@ import { CloudFoundryStoreModule } from './store/cloud-foundry.store.module'; ...generateStratosEntities(), ...generateASEntities(), // FIXME: Remove hard link between cf and autoscaler packages #4416 ]; - } + }, + multi: true } ] }, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts index 44d485252a..2677c0fc16 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts @@ -3,7 +3,7 @@ import { GetAppStatsAction } from '../actions/app-metadata.actions'; export interface AppStatsActionBuilders extends OrchestratedActionBuilders { getMultiple: (appGuid, endpointGuid) => GetAppStatsAction; -}; +} export const appStatsActionBuilders: AppStatsActionBuilders = { getMultiple: (appGuid, endpointGuid) => new GetAppStatsAction(appGuid, endpointGuid) diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts index 03dc4fcc43..deda2a9dba 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts @@ -19,7 +19,7 @@ export interface DomainActionBuilders extends OrchestratedActionBuilders { paginationKey?: string, meta?: CFBasePipelineRequestActionMeta ) => GetAllOrganizationDomains; -}; +} export const domainActionBuilders: DomainActionBuilders = { get: ( @@ -43,5 +43,3 @@ export const domainActionBuilders: DomainActionBuilders = { } ) => new GetAllOrganizationDomains(orgGuid, endpointGuid, paginationKey, meta.includeRelations, meta.populateMissing) }; - - diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts index 65e4d1030b..7d9bb796a2 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts @@ -6,7 +6,7 @@ export interface FeatureFlagActionBuilders extends OrchestratedActionBuilders { endpointGuid, paginationKey?, ) => GetAllFeatureFlags; -}; +} export const featureFlagActionBuilders: FeatureFlagActionBuilders = { getMultiple: ( diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts deleted file mode 100644 index 47c2b83a4d..0000000000 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - EntityRequestActionConfig, - KnownEntityActionBuilder, - OrchestratedActionBuilderConfig, - OrchestratedActionBuilders, -} from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { FetchBranchesForProject, FetchBranchForProject, FetchCommits } from '../actions/deploy-applications.actions'; -import { FetchGitHubRepoInfo } from '../actions/github.actions'; -import { GitSCM } from '../shared/data-services/scm/scm'; - -export interface GitRepoActionBuilders extends OrchestratedActionBuilders { - getRepoInfo: ( - meta: GitMeta - ) => FetchGitHubRepoInfo; -} - -export const gitRepoActionBuilders: GitRepoActionBuilders = { - getRepoInfo: ( - meta: GitMeta - ) => new FetchGitHubRepoInfo(meta) -}; - -export interface GitMeta { - projectName: string; - scm: GitSCM; // FIXME: Remove from action, see #4245 - commitSha?: string; - branchName?: string; -} - -export interface GitCommitActionBuildersConfig extends OrchestratedActionBuilderConfig { - get: EntityRequestActionConfig>; - getMultiple: (commitSha: string, endpointGuid: string, projectMeta: GitMeta) => FetchCommits; -} - -export interface GitCommitActionBuilders extends OrchestratedActionBuilders { - get: KnownEntityActionBuilder; - getMultiple: (commitSha: string, endpointGuid: string, projectMeta: GitMeta) => FetchCommits; -} - -export const gitCommitActionBuilders: GitCommitActionBuildersConfig = { - get: new EntityRequestActionConfig>( - (id, endpointGuid, meta) => meta.scm.getCommitApiUrl(meta.projectName, meta.commitSha), - { - externalRequest: true - } - ), - getMultiple: ( - commitSha: string, - endpointGuid: string, - commitMeta: GitMeta - ) => new FetchCommits(commitMeta.scm, commitMeta.projectName, commitSha) -}; - -export interface GitBranchActionBuilders extends OrchestratedActionBuilders { - /** - * guid & endpointGuid are optional - */ - get: ( - guid: string, - endpointId: string, - meta: GitMeta - ) => FetchBranchForProject; - /** - * endpointGuid & paginationKey are optional - */ - getMultiple: ( - endpointGuid: string, - paginationKey: string, - meta: GitMeta - ) => FetchBranchesForProject; -} - -export const gitBranchActionBuilders: GitBranchActionBuilders = { - get: ( - guid: string, - endpointId: string, - meta: GitMeta - ) => new FetchBranchForProject(meta.scm, meta.projectName, guid, meta.branchName), - getMultiple: ( - endpointGuid: string = null, - paginationKey: string = null, - meta?: GitMeta - ) => new FetchBranchesForProject(meta.scm, meta.projectName) -}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts index fec17c28d2..ec8cdd523f 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts @@ -8,7 +8,7 @@ export interface ServicePlanVisibilityActionBuilders extends OrchestratedActionB paginationKey, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta ) => GetServicePlanVisibilities; -}; +} export const servicePlanVisibilityActionBuilders: ServicePlanVisibilityActionBuilders = { getMultiple: ( diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts index e4b8391296..b7eb2e6801 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts @@ -7,8 +7,8 @@ export interface ServicePlanActionBuilders extends OrchestratedActionBuilders { endpointGuid: string, paginationKey: string, includeRelations?: string[] - ) => GetServicePlansForService -}; + ) => GetServicePlansForService; +} export const servicePlanActionBuilders: ServicePlanActionBuilders = { getAllForServiceInstance: ( diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts index aec68cfd2e..6d2c64657c 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts @@ -15,13 +15,13 @@ export interface SpaceQuotaDefinitionActionBuilders extends OrchestratedActionBu guid: string, endpointGuid: string, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta - ) => GetSpaceQuotaDefinition + ) => GetSpaceQuotaDefinition; create: ( id: string, endpointGuid: string, args: { - orgGuid: string - createQuota: QuotaFormValues + orgGuid: string; + createQuota: QuotaFormValues; }, ) => CreateSpaceQuotaDefinition; update: ( @@ -58,8 +58,8 @@ export const spaceQuotaDefinitionActionBuilders: SpaceQuotaDefinitionActionBuild id: string, endpointGuid: string, args: { - orgGuid: string - createQuota: QuotaFormValues + orgGuid: string; + createQuota: QuotaFormValues; } ) => new CreateSpaceQuotaDefinition(id, endpointGuid, args.orgGuid, args.createQuota), update: ( diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts index 1c265a167a..a5717d3806 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts @@ -21,12 +21,12 @@ export interface SpaceActionBuilders extends OrchestratedActionBuilders { remove: ( guid: string, endpointGuid: string, - { orgGuid }: { orgGuid: string } + { orgGuid }: { orgGuid: string, } ) => DeleteSpace; create: ( id: string, endpointGuid: string, - { orgGuid, createSpace }: { orgGuid: string, createSpace: IUpdateSpace } + { orgGuid, createSpace }: { orgGuid: string, createSpace: IUpdateSpace, } ) => CreateSpace; update: ( guid: string, @@ -70,15 +70,15 @@ export const spaceActionBuilders: SpaceActionBuilders = { endpointGuid, includeRelations || [], populateMissing - ) + ); action.entity = [cfEntityFactory(spaceWithOrgEntityType)]; - action.schemaKey = spaceWithOrgEntityType + action.schemaKey = spaceWithOrgEntityType; return action; }, remove: ( guid, endpointGuid, - { orgGuid }: { orgGuid: string } + { orgGuid }: { orgGuid: string, } ) => new DeleteSpace( guid, orgGuid, @@ -87,7 +87,7 @@ export const spaceActionBuilders: SpaceActionBuilders = { create: ( id: string, endpointGuid: string, - { orgGuid, createSpace }: { orgGuid: string, createSpace: IUpdateSpace } + { orgGuid, createSpace }: { orgGuid: string, createSpace: IUpdateSpace, } ) => new CreateSpace( endpointGuid, orgGuid, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts index 3ca122c4ff..3adbc49afe 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts @@ -21,7 +21,7 @@ export interface UserProvidedServiceActionBuilder extends OrchestratedActionBuil endpointGuid: string, guid: string, data: IUserProvidedServiceInstanceData, - proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => CreateUserProvidedServiceInstance, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => CreateUserProvidedServiceInstance; remove: ( guid: string, endpointGuid: string, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts index b12daa358f..92ff15dacc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts @@ -61,7 +61,7 @@ import { ApplicationService } from '../application.service'; ] }) export class ApplicationDeleteComponent { - relatedEntities$: Observable<{ instances: APIResource[], routes: APIResource[] }>; + relatedEntities$: Observable<{ instances: APIResource[], routes: APIResource[]; }>; public deleteStarted = false; public instanceDeleteColumns: ITableColumn>[] = [ { @@ -303,20 +303,20 @@ export class ApplicationDeleteComponent { if (success) { if (this.selectedRoutes && this.selectedRoutes.length) { this.selectedRoutes.forEach(route => { - cfEntityCatalog.route.api.delete(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid) + cfEntityCatalog.route.api.delete(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid); }); } if (this.selectedServiceInstances && this.selectedServiceInstances.length) { this.selectedServiceInstances.forEach(instance => { if (isUserProvidedServiceInstance(instance.entity.service_instance.entity)) { - cfEntityCatalog.userProvidedService.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid) + cfEntityCatalog.userProvidedService.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid); } else { - cfEntityCatalog.serviceInstance.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid) + cfEntityCatalog.serviceInstance.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid); } }); } } }) ); - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts index f3db600307..0b53c801da 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts @@ -28,7 +28,7 @@ import { ApplicationService } from '../../application.service'; export class AppDeleteServiceInstancesListConfigService extends AppServiceBindingListConfigService { hideRefresh: boolean; allowSelection: boolean; - obsCache: { [serviceGuid: string]: Observable } = {}; + obsCache: { [serviceGuid: string]: Observable, } = {}; constructor( store: Store, @@ -63,7 +63,7 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin { includeRelations: [], } - ) + ); this.obsCache[serviceBinding.entity.service_instance_guid] = fetchTotalResults( action, store, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.html index 34ef360c0f..b533b0a99a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.html @@ -23,5 +23,6 @@

Applications

\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.spec.ts index e7060da064..3c7ef0d531 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.spec.ts @@ -1,5 +1,6 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; import { TabNavService } from '../../../../../core/src/tab-nav.service'; import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; @@ -24,6 +25,15 @@ describe('ApplicationWallComponent', () => { DatePipe, TabNavService, CloudFoundryService, + { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: {}, + queryParams: {} + } + } + } ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.ts index c6cfa5d7dc..7552b1a9d3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-wall/application-wall.component.ts @@ -1,17 +1,17 @@ import { animate, query, style, transition, trigger } from '@angular/animations'; import { Component, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; +import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { applicationEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { ListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { CfAppConfigService } from '../../../shared/components/list/list-types/app/cf-app-config.service'; -import { CfAppsDataSource } from '../../../shared/components/list/list-types/app/cf-apps-data-source'; -import { CfOrgSpaceDataService, initCfOrgSpaceService } from '../../../shared/data-services/cf-org-space-service.service'; +import { CfOrgSpaceDataService } from '../../../shared/data-services/cf-org-space-service.service'; import { CloudFoundryService } from '../../../shared/data-services/cloud-foundry.service'; import { CfCurrentUserPermissions } from '../../../user-permissions/cf-user-permissions-checkers'; +import { goToAppWall } from '../../cf/cf.helpers'; @Component({ selector: 'app-application-wall', @@ -20,13 +20,13 @@ import { CfCurrentUserPermissions } from '../../../user-permissions/cf-user-perm animations: [ trigger( 'cardEnter', [ - transition('* => *', [ - query(':enter', [ - style({ opacity: 0, transform: 'translateY(10px)' }), - animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })) - ], { optional: true }) - ]) - ] + transition('* => *', [ + query(':enter', [ + style({ opacity: 0, transform: 'translateY(10px)' }), + animate('150ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })) + ], { optional: true }) + ]) + ] ) ], providers: [{ @@ -38,7 +38,6 @@ import { CfCurrentUserPermissions } from '../../../user-permissions/cf-user-perm }) export class ApplicationWallComponent implements OnDestroy { public cfIds$: Observable; - private initCfOrgSpaceService: Subscription; public canCreateApplication: string; @@ -47,8 +46,16 @@ export class ApplicationWallComponent implements OnDestroy { constructor( public cloudFoundryService: CloudFoundryService, private store: Store, - private cfOrgSpaceService: CfOrgSpaceDataService, + public cfOrgSpaceService: CfOrgSpaceDataService, + activatedRoute: ActivatedRoute, ) { + // If we have an endpoint ID, select it and redirect + const { endpointId } = activatedRoute.snapshot.params; + if (endpointId) { + goToAppWall(this.store, endpointId); + return; + } + this.cfIds$ = cloudFoundryService.cFEndpoints$.pipe( map(endpoints => endpoints.map(endpoint => endpoint.guid)), ); @@ -57,14 +64,8 @@ export class ApplicationWallComponent implements OnDestroy { this.haveConnectedCf$ = cloudFoundryService.connectedCFEndpoints$.pipe( map(endpoints => !!endpoints && endpoints.length > 0) ); - - this.initCfOrgSpaceService = initCfOrgSpaceService(this.store, - this.cfOrgSpaceService, - applicationEntityType, - CfAppsDataSource.paginationKey).subscribe(); } ngOnDestroy(): void { - this.initCfOrgSpaceService.unsubscribe(); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.spec.ts index 23282a262b..3b7a2dd197 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.spec.ts @@ -3,14 +3,14 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../core/src/core/core.module'; import { ExtensionService } from '../../../../core/src/core/extension/extension-service'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../core/src/core/github.helpers'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../git/src/shared/github.helpers'; +import { GitSCMService } from '../../../../git/src/shared/scm/scm.service'; import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { AppStoreModule } from '../../../../store/src/store.module'; import { generateTestApplicationServiceProvider } from '../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../test-framework/cloud-foundry-endpoint-service.helper'; import { LongRunningCfOperationsService } from '../../shared/data-services/long-running-cf-op.service'; -import { GitSCMService } from '../../shared/data-services/scm/scm.service'; import { ApplicationStateService } from '../../shared/services/application-state.service'; import { ApplicationService } from './application.service'; import { ApplicationEnvVarsHelper } from './application/application-tabs-base/tabs/build-tab/application-env-vars.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts index 628b8560a4..a7b41a4e54 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts @@ -178,12 +178,12 @@ export class ApplicationService { public getApplicationEnvVarsMonitor() { return cfEntityCatalog.appEnvVar.store.getEntityMonitor( this.appGuid - ) + ); } private constructAmalgamatedObservables() { // Assign/Amalgamate them to public properties (with mangling if required) - const appStats = cfEntityCatalog.appStats.store.getPaginationService(this.appGuid, this.cfGuid) + const appStats = cfEntityCatalog.appStats.store.getPaginationService(this.appGuid, this.cfGuid); // This will fail to fetch the app stats if the current app is not running but we're // willing to do this to speed up the initial fetch for a running application. this.appStats$ = appStats.entities$; @@ -268,7 +268,7 @@ export class ApplicationService { ); } - isEntityComplete(value, requestInfo: { fetching: boolean }): boolean { + isEntityComplete(value, requestInfo: { fetching: boolean, }): boolean { if (requestInfo) { return !requestInfo.fetching; } else { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts index 046af5a750..1b537529f6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts @@ -74,7 +74,7 @@ export class ApplicationPollingService { ).subscribe(resource => { cfEntityCatalog.appSummary.api.get(appGuid, cfGuid); if (resource && resource.entity && resource.entity.entity && resource.entity.entity.state === 'STARTED') { - cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid) + cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid); } }); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.spec.ts index db27792fcc..2bac8414af 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.spec.ts @@ -6,10 +6,10 @@ import { RouterTestingModule } from '@angular/router/testing'; import { StoreModule } from '@ngrx/store'; import { CoreModule } from '../../../../../../core/src/core/core.module'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../core/src/core/github.helpers'; import { MDAppModule } from '../../../../../../core/src/core/md.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../core/src/tab-nav.service'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../git/src/shared/github.helpers'; import { generateTestApplicationServiceProvider } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationStateService } from '../../../../shared/services/application-state.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts index 12db72f9ba..a16de404aa 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts @@ -1,11 +1,11 @@ import { Component, NgZone, OnDestroy, OnInit } from '@angular/core'; import { Store } from '@ngrx/store'; +import { GitSCMService, GitSCMType } from '@stratosui/git'; import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; import { filter, first, map, startWith, switchMap, withLatestFrom } from 'rxjs/operators'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { IAppFavMetadata } from '../../../../../../cloud-foundry/src/cf-metadata-types'; import { EndpointsService } from '../../../../../../core/src/core/endpoints.service'; import { getActionsFromExtensions, @@ -20,17 +20,16 @@ import { IPageSideNavTab } from '../../../../../../core/src/features/dashboard/p import { IHeaderBreadcrumb } from '../../../../../../core/src/shared/components/page-header/page-header.types'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; -import { FavoritesConfigMapper } from '../../../../../../store/src/favorite-config-mapper'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { endpointEntitiesSelector } from '../../../../../../store/src/selectors/endpoint.selectors'; import { APIResource } from '../../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; -import { getFavoriteFromEntity } from '../../../../../../store/src/user-favorite-helpers'; +import { IFavoriteMetadata } from '../../../../../../store/src/types/user-favorites.types'; +import { UserFavoriteManager } from '../../../../../../store/src/user-favorite-manager'; import { UpdateExistingApplication } from '../../../../actions/application.actions'; import { IApp, IOrganization, ISpace } from '../../../../cf-api.types'; import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { GitSCMService, GitSCMType } from '../../../../shared/data-services/scm/scm.service'; import { ApplicationStateData } from '../../../../shared/services/application-state.service'; import { CfCurrentUserPermissions } from '../../../../user-permissions/cf-user-permissions-checkers'; import { ApplicationService } from '../../application.service'; @@ -48,10 +47,10 @@ export class ApplicationTabsBaseComponent implements OnInit, OnDestroy { public favorite$ = this.applicationService.app$.pipe( filter(app => !!app), - map(app => getFavoriteFromEntity(app.entity, applicationEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE)) + map(app => this.userFavoriteManager.getFavorite(app.entity, applicationEntityType, CF_ENDPOINT_TYPE)) ); - isBusyUpdating$: Observable<{ updating: boolean }>; + isBusyUpdating$: Observable<{ updating: boolean; }>; public extensionActions: StratosActionMetadata[] = getActionsFromExtensions(StratosActionType.Application); @@ -62,7 +61,7 @@ export class ApplicationTabsBaseComponent implements OnInit, OnDestroy { private ngZone: NgZone, private currentUserPermissionsService: CurrentUserPermissionsService, scmService: GitSCMService, - private favoritesConfigMapper: FavoritesConfigMapper, + private userFavoriteManager: UserFavoriteManager, private appPollingService: ApplicationPollingService ) { const catalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); @@ -130,7 +129,7 @@ export class ApplicationTabsBaseComponent implements OnInit, OnDestroy { (stratProject.deploySource.type === 'github' || stratProject.deploySource.type === 'gitscm') ) { const gitscm = stratProject.deploySource.scm || stratProject.deploySource.type; - const scm = scmService.getSCM(gitscm as GitSCMType); + const scm = scmService.getSCM(gitscm as GitSCMType, stratProject.deploySource.endpointGuid); const iconInfo = scm.getIcon(); // Add tab or update existing tab const tab = this.tabLinks.find(t => t.link === 'gitscm'); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts index f3abf44de4..6cabbdf3a9 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts @@ -18,6 +18,7 @@ export interface EnvVarStratosProjectSource { timestamp: number; project?: string; scm?: string; + endpointGuid: string; branch?: string; url?: string; commit?: string; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html index 147eb829b0..04f9217a96 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.html @@ -164,12 +164,41 @@ {{(applicationService.applicationStratProject$| async)?.deploySource.url}} - -
- {{ deploySource.commit | slice:0:8 }} - - +
+
+ + {{deploySource.label}} + + + + + + + {{ deploySource.project }} + +
+
+ + + + + + {{ deploySource.branch}} + + + + + + + {{ deploySource.commit | slice:0:8 }} + +
+
Deployed from local folder diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.scss b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.scss index 4c439a3228..b70214592a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.scss +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.scss @@ -43,6 +43,16 @@ margin-right: 8px; } } + + &__gitscm { + display: flex; + div { + flex: 1; + app-metadata-item:first-of-type { + margin-top: 0; + } + } + } } .app-metadata { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.spec.ts index 6f3aa1d408..b0b0411d95 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.spec.ts @@ -5,10 +5,10 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; -import { GITHUB_API_URL } from '../../../../../../../../core/src/core/github.helpers'; import { APP_GUID, CF_GUID } from '../../../../../../../../core/src/shared/entity.tokens'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../../../core/src/tab-nav.service'; +import { GITHUB_API_URL } from '../../../../../../../../git/src/shared/github.helpers'; import { AppStoreModule } from '../../../../../../../../store/src/store.module'; import { ApplicationServiceMock } from '../../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts index 26f9c2b373..ad2f5a7134 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Store } from '@ngrx/store'; +import { GitCommit, gitEntityCatalog, GitRepo, GitSCMService, GitSCMType, SCMIcon } from '@stratosui/git'; import { combineLatest as observableCombineLatest, Observable, of as observableOf, of } from 'rxjs'; import { combineLatest, delay, distinct, filter, first, map, mergeMap, startWith, switchMap, tap } from 'rxjs/operators'; @@ -18,11 +19,11 @@ import { ActionState } from '../../../../../../../../store/src/reducers/api-requ import { EntityInfo } from '../../../../../../../../store/src/types/api.types'; import { IAppSummary } from '../../../../../../cf-api.types'; import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; -import { GitSCMService, GitSCMType } from '../../../../../../shared/data-services/scm/scm.service'; import { CfCurrentUserPermissions } from '../../../../../../user-permissions/cf-user-permissions-checkers'; import { ApplicationMonitorService } from '../../../../application-monitor.service'; import { ApplicationData, ApplicationService } from '../../../../application.service'; import { DEPLOY_TYPES_IDS } from '../../../../deploy-application/deploy-application-steps.types'; +import { EnvVarStratosProjectSource } from './application-env-vars.service'; const isDockerHubRegEx = /^([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_-]+):([a-zA-Z0-9_.-]+)/g; @@ -48,6 +49,12 @@ const appRestageConfirmation = new ConfirmationDialogConfig( 'Restage' ); +interface CustomEnvVarStratosProjectSource extends EnvVarStratosProjectSource { + label?: string; + icon?: SCMIcon; + commitURL?: string; +} + @Component({ selector: 'app-build-tab', templateUrl: './build-tab.component.html', @@ -57,7 +64,7 @@ const appRestageConfirmation = new ConfirmationDialogConfig( ] }) export class BuildTabComponent implements OnInit { - public isBusyUpdating$: Observable<{ updating: boolean }>; + public isBusyUpdating$: Observable<{ updating: boolean, }>; public manageAppPermission = CfCurrentUserPermissions.APPLICATION_MANAGE; constructor( @@ -78,7 +85,9 @@ export class BuildTabComponent implements OnInit { sshStatus$: Observable; - deploySource$: Observable<{ type: string, [name: string]: any }>; + deploySource$: Observable; + + public gitRepo$: Observable; ngOnInit() { this.cardTwoFetching$ = this.applicationService.application$.pipe( @@ -115,7 +124,17 @@ export class BuildTabComponent implements OnInit { this.applicationService.cfGuid, space.metadata.guid) ) - ) + ); + + this.gitRepo$ = this.applicationService.applicationStratProject$.pipe( + map(project => { + const scmType = project.deploySource.scm || project.deploySource.type; + const scm = this.scmService.getSCM(scmType as GitSCMType, project.deploySource.endpointGuid); + return gitEntityCatalog.repo.store.getRepoInfo.getEntityService({ projectName: project.deploySource.project, scm }); + }), + switchMap(repoService => repoService.waitForEntity$), + map(p => p.entity) + ); const deploySource$ = observableCombineLatest( this.applicationService.applicationStratProject$, @@ -123,7 +142,7 @@ export class BuildTabComponent implements OnInit { ).pipe( map(([project, app]) => { if (!!project) { - const deploySource = { ...project.deploySource } as any; + const deploySource: CustomEnvVarStratosProjectSource = { ...project.deploySource }; // Legacy if (deploySource.type === 'github') { @@ -131,14 +150,6 @@ export class BuildTabComponent implements OnInit { deploySource.scm = 'github'; } - if (deploySource.type === 'gitscm') { - const scmType = deploySource.scm as GitSCMType; - const scm = this.scmService.getSCM(scmType); - deploySource.label = scm.getLabel(); - deploySource.commitURL = scm.getCommitURL(deploySource.project, deploySource.commit); - deploySource.icon = scm.getIcon(); - } - if (deploySource.type === DEPLOY_TYPES_IDS.DOCKER_IMG) { return { type: 'docker', @@ -158,8 +169,34 @@ export class BuildTabComponent implements OnInit { return null; } }), + switchMap((deploySource: CustomEnvVarStratosProjectSource) => { + const res: Observable[] = [ + of(deploySource), + ]; + if (deploySource && deploySource.type === 'gitscm') { + // Add gitscm info... add async info in next section + const scmType = deploySource.scm as GitSCMType; + const scm = this.scmService.getSCM(scmType, deploySource.endpointGuid); + deploySource.label = scm.getLabel(); + deploySource.icon = scm.getIcon(); + res.push(gitEntityCatalog.commit.store.getEntityService(null, scm.endpointGuid, { + projectName: deploySource.project, + scm, + commitSha: deploySource.commit + }).entityObs$); + } else { + res.push(of(null)); + } + return observableCombineLatest(res); + }), + map(([deploySource, commit]: [CustomEnvVarStratosProjectSource, EntityInfo]) => { + if (deploySource) { + deploySource.commitURL = commit?.entity?.html_url; + } + return deploySource; + }), startWith({ type: 'loading' }) - ) + ); this.deploySource$ = canSeeEnvVars$.pipe( switchMap(canSeeEnvVars => canSeeEnvVars ? deploySource$ : of(null)), @@ -187,7 +224,7 @@ export class BuildTabComponent implements OnInit { private dispatchAppStats = () => { const { cfGuid, appGuid } = this.applicationService; cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid); - } + }; restartApplication() { this.confirmDialog.open(appRestartConfirmation, () => { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.html index 2719c0700c..6143ee88af 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.html @@ -1,87 +1,109 @@ - - - - - - Deployment Information - - -
- - {{stratosProject.deploySource.project }} - - - - {{ stratosProject.deploySource.branch}} - - -
-
- - {{ stratosProject.deploySource.commit | limitTo: 8}} + +
+ + + + + + Deployment Information + + +
+ + {{stratosProject.deploySource.project }} + + + + {{ stratosProject.deploySource.branch}} + + +
+ +
+
+ warning +
+
The + {{ stratosProject.deploySource.branch }} + branch has been updated since this app was deployed. Redeploy to update
+
+
+ {{ stratosProject.deploySource.timestamp * 1000 | date:'medium' }}
-
+ + + + + + + Repository Details + + +
+
+ +
+
+ + + + {{ gitSCMRepo.owner.login || gitSCMRepo.owner.name }} + + {{ gitSCMRepo.description || '-' }} + {{ gitSCMRepo.created_at | date:'medium' }} + + {{ gitSCMRepo.pushed_at | date:'medium' }} + + {{ gitSCMRepo.last_activity_at | date:'medium' }} +
+
+
+
+
+ + + + Commit Details + + +
+
+ +
- warning + {{ commitInfo.commit.message }} + + {{ commitInfo.sha | limitTo: 8}} + + + + + {{ commitInfo.commit.author.date | date:'medium' }} +
-
The {{ stratosProject.deploySource.branch}} branch has been updated since this app was deployed. Redeploy to update
-
- {{ stratosProject.deploySource.timestamp * 1000 | date:'medium' }} -
- - - - - - - Repository Details - - - -
-
- -
-
- - {{ gitSCMRepo.full_name }} - - {{ gitSCMRepo.owner.login || gitSCMRepo.owner.name }} - {{ gitSCMRepo.description }} - {{ gitSCMRepo.created_at | date:'medium' }} - {{ gitSCMRepo.pushed_at | date:'medium' }} - {{ gitSCMRepo.last_activity_at | date:'medium' }} -
-
-
-
-
- - - - Commit Details - - -
-
- -
-
- {{ commitInfo.commit.message }} - - {{ commitInfo.sha | limitTo: 8}} - - - - - {{ commitInfo.commit.author.date | date:'medium' }} -
-
-
-
-
- - - + + + + + + + + +
+ \ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.scss b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.scss index a7f500398d..05b0261327 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.scss +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.scss @@ -8,11 +8,30 @@ padding-left: 24px; } } - .gitscm-tab__avatar { + &__avatar { img { float: right; height: 84px; width: 84px; } } + + &__repo { + &__name { + align-items: center; + display: flex; + word-break: break-all; + a { + flex: 1; + } + &--icon { + font-size: 18px; + height: 18px; + line-height: 18px; + margin-left: 5px; + margin-right: 0; + width: 18px; + } + } + } } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.spec.ts index 81fa6de062..af8f5fcd90 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.spec.ts @@ -6,15 +6,15 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../../../core/src/core/github.helpers'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; +import { + GithubCommitAuthorComponent, +} from '../../../../../../../../git/src/shared/components/github-commit-author/github-commit-author.component'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../../../git/src/shared/github.helpers'; +import { GitSCMService } from '../../../../../../../../git/src/shared/scm/scm.service'; import { ApplicationServiceMock } from '../../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../../../application.service'; -import { - GithubCommitAuthorComponent, -} from './../../../../../../shared/components/github-commit-author/github-commit-author.component'; -import { GitSCMService } from './../../../../../../shared/data-services/scm/scm.service'; import { GitSCMTabComponent } from './gitscm-tab.component'; describe('GitSCMTabComponent', () => { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts index 32d2c03c3e..bed4d15c30 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts @@ -2,19 +2,28 @@ import { DatePipe } from '@angular/common'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; -import { Observable, of as observableOf, Subscription } from 'rxjs'; -import { distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators'; +import { GitCommit, gitEntityCatalog, GitMeta, GitRepo, GitSCMService, GitSCMType, SCMIcon } from '@stratosui/git'; +import { Observable, Subscription } from 'rxjs'; +import { + distinctUntilChanged, + filter, + first, + map, + publishReplay, + refCount, + startWith, + switchMap, + withLatestFrom, +} from 'rxjs/operators'; import { ListConfig } from '../../../../../../../../core/src/shared/components/list/list.component.types'; -import { EntityService } from '../../../../../../../../store/src/entity-service'; +import { + NoContentMessageLine, +} from '../../../../../../../../core/src/shared/components/no-content-message/no-content-message.component'; import { CFAppState } from '../../../../../../cf-app-state'; -import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; -import { GitMeta } from '../../../../../../entity-action-builders/git-action-builder'; import { GithubCommitsListConfigServiceAppTab, } from '../../../../../../shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service'; -import { GitSCMService, GitSCMType } from '../../../../../../shared/data-services/scm/scm.service'; -import { GitBranch, GitCommit, GitRepo } from '../../../../../../store/types/git.types'; import { ApplicationService } from '../../../../application.service'; import { EnvVarStratosProject } from '../build-tab/application-env-vars.service'; @@ -34,27 +43,30 @@ import { EnvVarStratosProject } from '../build-tab/application-env-vars.service' }, deps: [Store, DatePipe, GitSCMService, ApplicationService] } - ] + ], }) export class GitSCMTabComponent implements OnInit, OnDestroy { - gitBranchEntityService: EntityService; - gitCommitEntityService: EntityService; - gitSCMRepoEntityService: EntityService; - - deployAppSubscription: Subscription; - stratosProject$: Observable; - gitSCMRepo$: Observable; - gitSCMRepoErrorSub: Subscription; - commit$: Observable; - isHead$: Observable; - initialised$: Observable; + public hasRepo$: Observable; + public isLoading$: Observable; + + public gitSCMRepo$: Observable; + public commit$: Observable; + public isHead$: Observable; + + private gitSCMRepoErrorSub: Subscription; private snackBarRef: MatSnackBarRef; + public noContentFirstLine = 'Unable to fetch details'; + public noContentSecondLine: NoContentMessageLine = { + text: 'This repository may be private or has been removed.' + }; + public noContentOtherLines: NoContentMessageLine[] = [{ + text: 'Alternatively this may be due to a communication issue.' + }]; + public icon$: Observable; + ngOnDestroy(): void { - if (this.deployAppSubscription) { - this.deployAppSubscription.unsubscribe(); - } if (this.snackBarRef) { this.snackBarRef.dismiss(); } @@ -64,67 +76,92 @@ export class GitSCMTabComponent implements OnInit, OnDestroy { } constructor( - private applicationService: ApplicationService, + public appService: ApplicationService, private snackBar: MatSnackBar, private scmService: GitSCMService ) { } + private createBaseGitMeta(stProject: EnvVarStratosProject): GitMeta { + // Fallback to type if scm is not set (legacy support) + const scmType = stProject.deploySource.scm || stProject.deploySource.type; + const scm = this.scmService.getSCM(scmType as GitSCMType, stProject.deploySource.endpointGuid); + + return { projectName: stProject.deploySource.project, scm }; + } + ngOnInit() { - this.stratosProject$ = this.applicationService.applicationStratProject$.pipe( - take(1), - tap((stProject: EnvVarStratosProject) => { - const projectName = stProject.deploySource.project; - const commitSha = stProject.deploySource.commit.trim(); - - // Fallback to type if scm is not set (legacy support) - const scmType = stProject.deploySource.scm || stProject.deploySource.type; - const scm = this.scmService.getSCM(scmType as GitSCMType); - - const gitRepInfoMeta: GitMeta = { projectName: stProject.deploySource.project, scm }; - this.gitSCMRepoEntityService = cfEntityCatalog.gitRepo.store.getRepoInfo.getEntityService(gitRepInfoMeta); - - const gitMeta: GitMeta = { projectName: stProject.deploySource.project, scm, commitSha }; - const repoEntityID = `${scmType}-${projectName}`; - const commitEntityID = `${repoEntityID}-${commitSha}`; // FIXME: Should come from action #4245 - this.gitCommitEntityService = cfEntityCatalog.gitCommit.store.getEntityService(commitEntityID, null, gitMeta); - - this.gitBranchEntityService = cfEntityCatalog.gitBranch.store.getEntityService(undefined, undefined, { - scm, - projectName, - branchName: stProject.deploySource.branch - }); - - - this.gitSCMRepo$ = this.gitSCMRepoEntityService.waitForEntity$.pipe( - map(p => p.entity && p.entity) - ); - - this.gitSCMRepoErrorSub = this.gitSCMRepoEntityService.entityMonitor.entityRequest$.pipe( - filter(request => !!request.error), - map(request => request.message), - distinctUntilChanged(), - ).subscribe(errorMessage => { - if (this.snackBarRef) { - this.snackBarRef.dismiss(); - } - this.snackBarRef = this.snackBar.open(`Unable to fetch ${scm.getLabel()} project: ${errorMessage}`, 'Dismiss'); - }); - - this.commit$ = this.gitCommitEntityService.waitForEntity$.pipe( - map(p => p.entity) - ); - - this.isHead$ = this.gitBranchEntityService.waitForEntity$.pipe( - map(p => { - return ( - p.entity.commit.sha === - stProject.deploySource.commit.trim() - ); - }), - tap(p => (this.initialised$ = observableOf(true))) - ); + const coreInfo$: Observable<[EnvVarStratosProject, GitMeta]> = this.appService.applicationStratProject$.pipe( + first(), + map(stProject => [stProject, this.createBaseGitMeta(stProject)]) + ); + + this.icon$ = this.appService.applicationStratProject$.pipe( + first(), + map((stProject: EnvVarStratosProject) => { + const meta: GitMeta = this.createBaseGitMeta(stProject); + return meta.scm.getIcon(); }) ); - } + this.hasRepo$ = this.appService.applicationStratProject$.pipe( + first(), + switchMap((stProject: EnvVarStratosProject) => { + const gitRepInfoMeta: GitMeta = this.createBaseGitMeta(stProject); + return gitEntityCatalog.repo.store.getRepoInfo.getEntityService(gitRepInfoMeta).entityObs$; + }), + map(entity => entity.entity ? true : entity.entityRequestInfo.error ? false : undefined), + startWith(undefined), + publishReplay(1), + refCount() + ); + + this.isLoading$ = this.hasRepo$.pipe( + filter(hasRepo => hasRepo !== undefined), + map(() => false), + startWith(true) + ); + + const blockedOnRepo$: Observable<[EnvVarStratosProject, GitMeta]> = this.hasRepo$.pipe( + filter(hasRepo => hasRepo), + switchMap(() => coreInfo$) + ); + + this.gitSCMRepo$ = blockedOnRepo$.pipe( + map(([, baseGitMeta]) => gitEntityCatalog.repo.store.getRepoInfo.getEntityService(baseGitMeta)), + switchMap(repoService => repoService.waitForEntity$), + map(p => p.entity) + ); + + this.gitSCMRepoErrorSub = this.hasRepo$.pipe( + filter(hasRepo => hasRepo === false), + switchMap(() => coreInfo$), + switchMap(([, baseGitMeta]) => gitEntityCatalog.repo.store.getRepoInfo.getEntityService(baseGitMeta).entityMonitor.entityRequest$), + map(request => request.message), + distinctUntilChanged(), + withLatestFrom(coreInfo$) + ).subscribe(([errorMessage, [, baseGitMeta]]) => { + if (this.snackBarRef) { + this.snackBarRef.dismiss(); + } + this.snackBarRef = this.snackBar.open(`Unable to fetch ${baseGitMeta.scm.getLabel()} project: ${errorMessage}`, 'Dismiss'); + }); + + this.commit$ = blockedOnRepo$.pipe( + map(([stProject, baseGitMeta]) => gitEntityCatalog.commit.store.getEntityService(null, null, { + ...baseGitMeta, + commitSha: stProject.deploySource.commit.trim() + })), + switchMap(commitService => commitService.waitForEntity$), + map(p => p.entity) + ); + this.isHead$ = blockedOnRepo$.pipe( + map(([stProject, baseGitMeta]) => gitEntityCatalog.branch.store.getEntityService(undefined, undefined, { + ...baseGitMeta, + branchName: stProject.deploySource.branch + })), + switchMap(branchService => branchService.waitForEntity$), + withLatestFrom(blockedOnRepo$), + map(([p, [stProject]]) => p.entity.commit.sha === stProject.deploySource.commit.trim()), + ); + } } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.ts index cc4a4f4bd7..8f207f162d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.ts @@ -105,7 +105,7 @@ export class LogStreamTabComponent implements OnInit { msgColour = 'red'; bold = true; } - const messageString = this.colorizer.colorize(atob(messageObj.message), msgColour, bold) + '\n'; + const messageString = this.colorizer.colorize(decodeURIComponent(escape(atob(messageObj.message))), msgColour, bold) + '\n'; return timeStamp + ': ' + messageSource + ' ' + messageString; } catch (error) { console.error('Failed to filter jsonMessage from WebSocket: ' + JSON.stringify(error)); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/applications.module.ts b/src/frontend/packages/cloud-foundry/src/features/applications/applications.module.ts index ce590dbaa6..aef3d5cd18 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/applications.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/applications.module.ts @@ -4,6 +4,7 @@ import { NgModule } from '@angular/core'; import { CfAutoscalerModule } from '../../../../cf-autoscaler/src/cf-autoscaler.module'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; +import { GitSharedModule } from '../../../../git/src/shared/git-shared.module'; import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { ApplicationDeleteComponent } from './application-delete/application-delete.component'; import { @@ -47,7 +48,8 @@ import { SshApplicationComponent } from './ssh-application/ssh-application.compo ApplicationsRoutingModule, CloudFoundrySharedModule, // FIXME: Remove hard link between cf and autoscaler packages #4416 - CfAutoscalerModule + CfAutoscalerModule, + GitSharedModule ], declarations: [ ApplicationWallComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/applications.routing.ts b/src/frontend/packages/cloud-foundry/src/features/applications/applications.routing.ts index 1b0ffd86b4..d8f3bf62cf 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/applications.routing.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/applications.routing.ts @@ -39,6 +39,12 @@ const applicationsRoutes: Routes = [ { path: 'new', component: NewApplicationBaseStepComponent, + pathMatch: 'full' + }, + { + path: 'new/:endpointId', + component: NewApplicationBaseStepComponent, + pathMatch: 'full' }, { path: 'create', @@ -59,6 +65,11 @@ const applicationsRoutes: Routes = [ extensionsActionsKey: StratosActionType.Applications } }, + { + path: ':endpointId', + component: ApplicationWallComponent, + pathMatch: 'full' + }, { path: ':endpointId/:id', component: ApplicationBaseComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts index 3a700a6462..b5e013d4a1 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts @@ -78,7 +78,7 @@ export class CreateApplicationStep3Component implements OnInit { return observableOf({ success: false, message: err.message }); }) ); - } + }; validate(): boolean { return this.setDomainHost.valid; @@ -93,9 +93,9 @@ export class CreateApplicationStep3Component implements OnInit { const obs$ = cfEntityCatalog.application.api.create( newAppGuid, cloudFoundry, { - name, - space_guid: space - }); + name, + space_guid: space + }); return this.wrapObservable(obs$, 'Could not create application'); } @@ -117,7 +117,7 @@ export class CreateApplicationStep3Component implements OnInit { domain_guid: selectedDomainGuid, host: hostName } - ) + ); return this.wrapObservable(obs$, 'Application created. Could not create route'); } return observableOf({ @@ -137,7 +137,7 @@ export class CreateApplicationStep3Component implements OnInit { deleting: null, response: null })) - ) + ); return this.wrapObservable(obs$, 'Application and route created. Could not associated route with app'); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.ts index 438d60af57..48e54d2ce1 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.ts @@ -4,10 +4,10 @@ import { Subscription } from 'rxjs'; import { filter, first, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { applicationEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { selectCfPaginationState } from '../../../../../cloud-foundry/src/store/selectors/pagination.selectors'; +import { applicationEntityType } from '../../../cf-entity-types'; import { CfAppsDataSource } from '../../../shared/components/list/list-types/app/cf-apps-data-source'; import { CfOrgSpaceDataService } from '../../../shared/data-services/cf-org-space-service.service'; +import { selectCfPaginationState } from '../../../store/selectors/pagination.selectors'; @Component({ selector: 'app-create-application', @@ -22,6 +22,9 @@ export class CreateApplicationComponent implements OnInit, OnDestroy { ngOnInit() { // We will auto select endpoint/org/space that have been selected on the app wall. + this.cfOrgSpaceService.enableAutoSelectors(); + // FIXME: This has been broken for a while (setting cf will clear org + space after org and space has been set) + // With new tools (set initial/enable auto) this should be easier to fix const appWallPaginationState = this.store.select(selectCfPaginationState(applicationEntityType, CfAppsDataSource.paginationKey)); this.paginationStateSub = appWallPaginationState.pipe(filter(pag => !!pag), first(), tap(pag => { const { cf, org, space } = pag.clientPagination.filter.items; @@ -29,7 +32,6 @@ export class CreateApplicationComponent implements OnInit, OnDestroy { this.cfOrgSpaceService.cf.select.next(cf); } if (cf && org) { - this.cfOrgSpaceService.org.select.next(org); } if (cf && org && space) { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-deployer.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-deployer.ts index 12a575759e..e575c35ddd 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-deployer.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-deployer.ts @@ -44,6 +44,7 @@ interface GitSCMSourceInfo extends DeploySource { url: string; commit: string; scm: string; + endpointGuid: string; } // Structure used to provide metadata about the Git Url source @@ -229,7 +230,7 @@ export class DeployApplicationDeployer { type: SocketEventTypes.OVERRIDES_SUPPLIED }; return JSON.stringify(msg); - } + }; sendProjectInfo = (appSource: DeployApplicationSource) => { if (appSource.type.group === 'gitscm') { @@ -242,7 +243,7 @@ export class DeployApplicationDeployer { return this.sendDockerImageMetadata(appSource); } return ''; - } + }; sendGitSCMSourceMetadata = (appSource: DeployApplicationSource) => { const gitscm: GitSCMSourceInfo = { @@ -251,7 +252,8 @@ export class DeployApplicationDeployer { type: appSource.type.group, commit: appSource.gitDetails.commit, url: appSource.gitDetails.url, - scm: appSource.type.id + scm: appSource.type.id, + endpointGuid: appSource.gitDetails.endpointGuid }; const msg = { @@ -260,7 +262,7 @@ export class DeployApplicationDeployer { type: SocketEventTypes.SOURCE_GITSCM }; return JSON.stringify(msg); - } + }; sendGitUrlSourceMetadata = (appSource: DeployApplicationSource) => { const gitUrl: GitUrlSourceInfo = { @@ -275,7 +277,7 @@ export class DeployApplicationDeployer { type: SocketEventTypes.SOURCE_GITURL }; return JSON.stringify(msg); - } + }; sendDockerImageMetadata = (appSource: DeployApplicationSource) => { const dockerInfo: DockerImageSourceInfo = { @@ -291,7 +293,7 @@ export class DeployApplicationDeployer { type: SocketEventTypes.SOURCE_DOCKER_IMG }; return JSON.stringify(msg); - } + }; sendCloseAcknowledgement = () => { const msg = { @@ -300,7 +302,7 @@ export class DeployApplicationDeployer { type: SocketEventTypes.CLOSE_ACK }; return JSON.stringify(msg); - } + }; processWebSocketMessage = (log) => { switch (log.type) { @@ -331,19 +333,19 @@ export class DeployApplicationDeployer { break; case SocketEventTypes.CLOSE_INVALID_MANIFEST: this.onClose(log, 'Deploy Failed - Invalid manifest!', - 'Failed to deploy app! Please make sure that a valid manifest.yaml was provided!'); + 'Failed to deploy app! Please make sure that a valid manifest.yaml was provided.'); break; case SocketEventTypes.CLOSE_NO_MANIFEST: this.onClose(log, 'Deploy Failed - No manifest present!', - 'Failed to deploy app! Please make sure that a valid manifest.yaml is present!'); + 'Failed to deploy app! Please make sure that a valid manifest.yaml is present.'); break; case SocketEventTypes.CLOSE_FAILED_CLONE: this.onClose(log, 'Deploy Failed - Failed to clone repository!', - 'Failed to deploy app! Please make sure the repository is public!'); + 'Failed to deploy app! Please make sure the repository is public.'); break; case SocketEventTypes.CLOSE_FAILED_NO_BRANCH: this.onClose(log, 'Deploy Failed - Failed to located branch!', - 'Failed to deploy app! Please make sure that branch exists!'); + 'Failed to deploy app! Please make sure that the branch exists.'); break; case SocketEventTypes.CLOSE_FAILURE: case SocketEventTypes.CLOSE_PUSH_ERROR: @@ -376,7 +378,7 @@ export class DeployApplicationDeployer { default: // noop } - } + }; private sendNextFile() { // Update for the previous file transfer diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.spec.ts index ca81b0308b..8ed3dd9a30 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.spec.ts @@ -1,12 +1,12 @@ import { CommonModule, DatePipe } from '@angular/common'; -import { HttpClientModule, HttpClient, HttpBackend } from '@angular/common/http'; +import { HttpBackend, HttpClient, HttpClientModule } from '@angular/common/http'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; import { CoreModule } from '../../../../../../../core/src/core/core.module'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../../core/src/core/github.helpers'; import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../../../git/src/shared/github.helpers'; import { generateCfStoreModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { SetAppSourceDetails } from '../../../../../actions/deploy-applications.actions'; import { CommitListWrapperComponent } from './commit-list-wrapper.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.ts index 4d916391d9..4a6e786028 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/commit-list-wrapper/commit-list-wrapper.component.ts @@ -1,16 +1,15 @@ import { DatePipe } from '@angular/common'; import { Component } from '@angular/core'; import { Store } from '@ngrx/store'; +import { GitCommit, GitSCMService } from '@stratosui/git'; import { Observable } from 'rxjs'; import { filter, map, mergeMap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; import { ListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { GithubCommitsListConfigServiceDeploy, } from '../../../../../shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service'; -import { GitSCMService } from '../../../../../shared/data-services/scm/scm.service'; @Component({ selector: 'app-commit-list-wrapper', diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/deploy-application-step2-1.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/deploy-application-step2-1.component.ts index dfc9efe55d..7bb65d9591 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/deploy-application-step2-1.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2-1/deploy-application-step2-1.component.ts @@ -8,12 +8,12 @@ import { ViewContainerRef, } from '@angular/core'; import { Store } from '@ngrx/store'; +import { GitCommit } from '@stratosui/git'; import { Observable } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; import { SetDeployCommit } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { GitCommit } from '../../../../../../cloud-foundry/src/store/types/git.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { CommitListWrapperComponent } from './commit-list-wrapper/commit-list-wrapper.component'; @@ -46,7 +46,7 @@ export class DeployApplicationStep21Component { onLeave = () => { this.wrapperRef.destroy(); this.target.clear(); - } + }; onEnter = () => { // Wrap the list component in another component. This means it's recreated every time to include changes in the github repo @@ -56,7 +56,7 @@ export class DeployApplicationStep21Component { this.validate = this.selectedCommit$.pipe( map(selectedCommit => !!selectedCommit) ); - } + }; onNext: StepOnNextFunction = () => { return this.selectedCommit$.pipe( @@ -66,5 +66,5 @@ export class DeployApplicationStep21Component { }), map(() => ({ success: true })) ); - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.html index 1635d731f3..9879d583f3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.html @@ -13,10 +13,16 @@
+ placeholder="Project" name="projectName" + [appGithubProjectExists]="sourceType.id + ',' + sourceType.endpointGuid" required> - {{repo}} + +
+
{{repo.name}}
+ lock +
+
; INITIAL_SOURCE_TYPE = 0; // Fall back to GitHub, for cases where there's no type in store (refresh) or url (removed & nav) @@ -84,13 +82,13 @@ export class DeployApplicationStep2Component // @Input('fsSourceData') fsSourceData; // ---- GIT ---------- - repositoryBranches$: Observable; + repositoryBranches$: Observable; projectInfo$: Observable; commitSubscription: Subscription; sourceType: SourceType; - repositoryBranch: GitBranch = { name: null, commit: null }; + repositoryBranch: GitBranch = null; repository: string; scm: GitSCM; @@ -98,7 +96,7 @@ export class DeployApplicationStep2Component cachedSuggestions = {}; // We don't have any repositories to suggest initially - need user to start typing - suggestedRepos$: Observable; + suggestedRepos$: Observable; // Git URL gitUrl: string; @@ -130,24 +128,34 @@ export class DeployApplicationStep2Component private httpClient: HttpClient, private appDeploySourceTypes: ApplicationDeploySourceTypes ) { - this.sourceTypes = appDeploySourceTypes.getTypes(); } onNext: StepOnNextFunction = () => { // Set the details based on which source type is selected if (this.sourceType.group === 'gitscm') { - this.store.dispatch(new SaveAppDetails({ + gitEntityCatalog.repo.store.getRepoInfo.getEntityService({ projectName: this.repository, - branch: this.repositoryBranch, - url: this.scm.getCloneURL(this.repository), - commit: this.isRedeploy ? this.commitInfo.sha : undefined - }, null)); + scm: this.scm, + }).waitForEntity$.pipe(first()).subscribe(repo => { + this.store.dispatch(new SaveAppDetails({ + projectName: this.repository, + branch: this.repositoryBranch, + url: repo.entity.clone_url, + commit: this.isRedeploy ? this.commitInfo.sha : undefined, + endpointGuid: this.sourceType.endpointGuid, + }, null)); + }); } else if (this.sourceType.id === DEPLOY_TYPES_IDS.GIT_URL) { this.store.dispatch(new SaveAppDetails({ projectName: this.gitUrl, branch: { - name: this.gitUrlBranchName - } + name: this.gitUrlBranchName, + guid: null, + projectName: null, + scmType: null, + endpointGuid: null, + }, + endpointGuid: null }, null)); } else if (this.sourceType.id === DEPLOY_TYPES_IDS.DOCKER_IMG) { this.store.dispatch(new SaveAppDetails(null, { @@ -157,15 +165,15 @@ export class DeployApplicationStep2Component })); } return observableOf({ success: true, data: this.sourceSelectionForm.form.value.fsLocalSource }); - } + }; ngOnInit() { this.sourceType$ = combineLatest( - of(this.appDeploySourceTypes.getAutoSelectedType(this.route)), + this.appDeploySourceTypes.getAutoSelectedType(this.route), this.store.select(selectSourceType), - of(this.sourceTypes[this.INITIAL_SOURCE_TYPE]) + this.appDeploySourceTypes.types$.pipe(first(), map(st => st[this.INITIAL_SOURCE_TYPE])) ).pipe( - map(([sourceFromStore, sourceFromParam, sourceDefault]) => sourceFromParam || sourceFromStore || sourceDefault), + map(([sourceFromParam, sourceFromStore, sourceDefault]) => sourceFromParam || sourceFromStore || sourceDefault), filter(sourceType => !!sourceType), ); @@ -219,7 +227,7 @@ export class DeployApplicationStep2Component } this.store.dispatch(new SetAppSourceDetails(sourceType)); - } + }; ngAfterContentInit() { this.validate = this.sourceSelectionForm.statusChanges.pipe(map(() => { @@ -250,12 +258,12 @@ export class DeployApplicationStep2Component distinctUntilChanged((x, y) => x.name.toLowerCase() === y.name.toLowerCase()), // Convert project name into branches pagination observable switchMap(state => - cfEntityCatalog.gitBranch.store.getPaginationService(null, null, { + gitEntityCatalog.branch.store.getPaginationService(null, null, { scm: this.scm, projectName: state.name }).entities$ ), - // Find the specific branch we're interested inS + // Find the specific branch we're interested in withLatestFrom(deployBranchName$), filter(([, branchName]) => !!branchName), tap(([branches, branchName]) => { @@ -263,7 +271,7 @@ export class DeployApplicationStep2Component branch => branch.name === branchName ); }), - map(([p, q]) => p), + map(([branches, branchName]) => branches), publishReplay(1), refCount() ); @@ -272,23 +280,20 @@ export class DeployApplicationStep2Component this.repositoryBranches$, deployBranchName$, this.projectInfo$, - deployCommit$ + deployCommit$, ).pipe( tap(([branches, name, projectInfo, commit]) => { const branch = branches.find(b => b.name === name); - if (branch && !!projectInfo && branch.projectId === projectInfo.full_name) { + if (branch && !!projectInfo && branch.projectName === projectInfo.full_name) { this.store.dispatch(new SetBranch(branch)); - if (this.isRedeploy) { const commitSha = commit || branch.commit.sha; - // FIXME: This method to create entity id's should be standardised.... #4245 - const repoEntityID = `${this.scm.getType()}-${projectInfo.full_name}`; - const commitEntityID = `${repoEntityID}-${commitSha}`; - const commitEntityService = cfEntityCatalog.gitCommit.store.getEntityService(commitEntityID, null, { + const commitGuid = getCommitGuid(this.scm.getType(), projectInfo.full_name, commitSha); + const commitEntityService = gitEntityCatalog.commit.store.getEntityService(commitGuid, null, { projectName: projectInfo.full_name, scm: this.scm, commitSha - }) + }); if (this.commitSubscription) { this.commitSubscription.unsubscribe(); @@ -307,10 +312,11 @@ export class DeployApplicationStep2Component const setSourceTypeModel$ = this.store.select(selectSourceType).pipe( filter(p => !!p), - tap(p => { - this.sourceType = this.sourceTypes.find(s => s.id === p.id); + withLatestFrom(this.appDeploySourceTypes.types$), + tap(([p, sourceTypes]) => { + this.sourceType = sourceTypes.find(s => s.id === p.id && (p.endpointGuid ? s.endpointGuid === p.endpointGuid : true)); - const newScm = this.scmService.getSCM(this.sourceType.id as GitSCMType); + const newScm = this.scmService.getSCM(this.sourceType.id as GitSCMType, this.sourceType.endpointGuid); if (!!newScm) { // User selected one of the SCM options if (this.scm && newScm.getType() !== this.scm.getType()) { @@ -320,7 +326,7 @@ export class DeployApplicationStep2Component this.repositoryBranch = null; this.store.dispatch(new SetBranch(null)); this.store.dispatch(new ProjectDoesntExist('')); - this.store.dispatch(new SaveAppDetails({ projectName: '', branch: null }, null)); + this.store.dispatch(new SaveAppDetails({ projectName: '', branch: null, endpointGuid: this.sourceType.endpointGuid }, null)); } this.scm = newScm; } @@ -347,9 +353,9 @@ export class DeployApplicationStep2Component ); } - updateSuggestedRepositories(name: string): Observable { + updateSuggestedRepositories(name: string): Observable { if (!name || name.length < 3) { - return observableOf([] as string[]); + return observableOf([] as GitSuggestedRepo[]); } const cacheName = this.scm.getType() + ':' + name; @@ -361,7 +367,7 @@ export class DeployApplicationStep2Component take(1), switchMap(() => this.scm.getMatchingRepositories(this.httpClient, name)), catchError(e => observableOf(null)), - tap(suggestions => this.cachedSuggestions[cacheName] = suggestions) + tap(suggestions => this.cachedSuggestions[cacheName] = suggestions), ); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts index 7e34bdc40b..c076181efb 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts @@ -1,5 +1,4 @@ import { Component, Input, OnDestroy } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; import { BehaviorSubject, @@ -14,6 +13,7 @@ import { DeleteDeployAppSection } from '../../../../../../cloud-foundry/src/acti import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { SnackBarService } from '../../../../../../core/src/shared/services/snackbar.service'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CfAppsDataSource } from '../../../../shared/components/list/list-types/app/cf-apps-data-source'; @@ -49,7 +49,7 @@ export class DeployApplicationStep3Component implements OnDestroy { constructor( private store: Store, - private snackBar: MatSnackBar, + private snackBarService: SnackBarService, public cfOrgSpaceService: CfOrgSpaceDataService ) { this.valid$ = observableOf(false); @@ -64,7 +64,7 @@ export class DeployApplicationStep3Component implements OnDestroy { // Observables this.errorSub = this.deployer.status$.pipe( filter((status) => status.error) - ).subscribe(status => this.snackBar.open(status.errorMsg, 'Dismiss')); + ).subscribe(status => this.snackBarService.show(status.errorMsg, 'Dismiss')); const appGuid$ = this.deployer.applicationGuid$.pipe( filter((appGuid) => appGuid !== null), @@ -126,9 +126,9 @@ export class DeployApplicationStep3Component implements OnDestroy { first() ).subscribe(status => { if (status.error) { - this.snackBar.open(status.errorMsg, 'Dismiss'); + this.snackBarService.show(status.errorMsg, 'Dismiss'); } else { - const ref = this.snackBar.open('Application deployment complete', 'View', { duration: 5000 }); + const ref = this.snackBarService.show('Application deployment complete', 'View', 10000, true); ref.onAction().subscribe(() => { this.goToAppSummary(); }); } this.deployer.close(); @@ -151,14 +151,14 @@ export class DeployApplicationStep3Component implements OnDestroy { this.deployer.deploy(); } this.busy = true; - } + }; onNext: StepOnNextFunction = () => { // Delete Deploy App Section this.store.dispatch(new DeleteDeployAppSection()); this.goToAppSummary(); return observableOf({ success: true }); - } + }; goToAppSummary() { // Take user to applications diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts index b20ecdb697..b92c91eb93 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts @@ -1,14 +1,16 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Observable, of } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap } from 'rxjs/operators'; import { SourceType } from '../../../../../cloud-foundry/src/store/types/deploy-application.types'; import { PermissionConfig } from '../../../../../core/src/core/permissions/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/permissions/current-user-permissions.service'; +import { GitSCM, GitSCMService } from '../../../../../git/src/public_api'; +import { GIT_ENDPOINT_SUB_TYPES, GIT_ENDPOINT_TYPE } from '../../../../../git/src/store/git-entity-factory'; +import { getFullEndpointApiUrl } from '../../../../../store/src/endpoint-utils'; +import { stratosEntityCatalog } from '../../../../../store/src/stratos-entity-catalog'; import { CFFeatureFlagTypes } from '../../../cf-api.types'; -import { CFAppState } from '../../../cf-app-state'; import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { CfPermissionTypes } from '../../../user-permissions/cf-user-permissions-checkers'; @@ -22,16 +24,17 @@ export enum DEPLOY_TYPES_IDS { } export const AUTO_SELECT_DEPLOY_TYPE_URL_PARAM = 'auto-select-deploy'; +export const AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM = 'auto-select-deploy-endpoint'; @Injectable() export class ApplicationDeploySourceTypes { - private types: SourceType[] = [ + private baseTypes: SourceType[] = [ { - name: 'Public GitHub', + name: 'GitHub', id: DEPLOY_TYPES_IDS.GITHUB, group: 'gitscm', - helpText: 'Please select the public GitHub project and branch you would like to deploy from.', + helpText: 'Please select the GitHub project and branch you would like to deploy from.', graphic: { // TODO: Move cf assets to CF package (#3769) location: '/core/assets/endpoint-icons/github-logo.png', @@ -39,10 +42,10 @@ export class ApplicationDeploySourceTypes { } }, { - name: 'Public GitLab', + name: 'GitLab', id: DEPLOY_TYPES_IDS.GITLAB, group: 'gitscm', - helpText: 'Please select the public GitLab project and branch you would like to deploy from.', + helpText: 'Please select the GitLab project and branch you would like to deploy from.', graphic: { location: '/core/assets/endpoint-icons/gitlab-icon-rgb.svg' } @@ -79,22 +82,85 @@ export class ApplicationDeploySourceTypes { graphic: { matIcon: 'folder' } }, ]; + public types$: Observable; + constructor( private perms: CurrentUserPermissionsService, - private store: Store, - ) { } + private scmService: GitSCMService + ) { + const scms: { [deployId: string]: GitSCM; } = { + [DEPLOY_TYPES_IDS.GITHUB]: this.scmService.getSCM('github', null), + [DEPLOY_TYPES_IDS.GITLAB]: this.scmService.getSCM('gitlab', null) + }; - getTypes(): SourceType[] { - return [ - ...this.types - ]; - } + this.types$ = stratosEntityCatalog.endpoint.store.getAll.getPaginationService().entities$.pipe( + filter(e => !!e), + map(endpoints => { + const newTypes: SourceType[] = []; + + // Add all the base types... also update git types if the user has provided credentials for it + this.baseTypes.forEach(t => { + const scm = scms[t.id]; + if (scm) { + // Find the endpoint that's associated with this git type + const eType = GIT_ENDPOINT_TYPE; + const eSubType: GIT_ENDPOINT_SUB_TYPES = scm.getType() === DEPLOY_TYPES_IDS.GITHUB ? + GIT_ENDPOINT_SUB_TYPES.GITHUB : + GIT_ENDPOINT_SUB_TYPES.GITLAB; + for (const e of endpoints) { + const url = getFullEndpointApiUrl(e); + if ( + e.cnsi_type === eType && + e.sub_type === eSubType && + url === scm.getPublicApi() // Must match the endpoint associated with github.com/gitlab.com types (not enterprise) + ) { + newTypes.push({ + ...t, + endpointGuid: e.guid + }); + return; + } + } + } + newTypes.push(t); + }); + // Add all enterprise github/gitlab types + endpoints.forEach(e => { + if (e.cnsi_type !== GIT_ENDPOINT_TYPE) { + return; + } + const deployId: DEPLOY_TYPES_IDS = e.sub_type === GIT_ENDPOINT_SUB_TYPES.GITHUB ? + DEPLOY_TYPES_IDS.GITHUB : + DEPLOY_TYPES_IDS.GITLAB; + const scm = scms[deployId]; + const url = getFullEndpointApiUrl(e); + // If this isn't the public api one... it must be enterprise + if (url !== scm.getPublicApi()) { + const index = newTypes.findIndex(nt => nt.id === deployId); + newTypes.splice(index + 1, 0, { + ...this.baseTypes[index], // Use similar settings to the original one but with more info + name: e.name, + endpointGuid: e.guid + }); + } + }); - getAutoSelectedType(activatedRoute: ActivatedRoute): SourceType { + return newTypes; + }), + publishReplay(1), + refCount() + ); + } + + getAutoSelectedType(activatedRoute: ActivatedRoute): Observable { const typeId = activatedRoute.snapshot.queryParams[AUTO_SELECT_DEPLOY_TYPE_URL_PARAM]; - return typeId ? this.getTypes().find(source => source.id === typeId) : null; + if (!typeId) { + return of(null); + } + const endpointGuid = activatedRoute.snapshot.queryParams[AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM]; + return this.types$.pipe(map(types => types.find(source => source.id === typeId && source.endpointGuid === endpointGuid))); } canDeployType(cfId: string, sourceId: string): Observable { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.html index cde7e260b2..43375d3b6c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.html @@ -1,5 +1,5 @@ -

{{ getTitle() }}

+

{{ getTitle() | async }}

@@ -29,8 +29,8 @@

{{ getTitle() }}

+ disablePrevious=true cancelButtonText="Close" [onEnter]="step3.onEnter" [onNext]="step3.onNext" + [showBusy]="step3.busy" finishButtonText="Go to App Summary">
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.spec.ts index 2124a1e765..43a27de167 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.spec.ts @@ -5,9 +5,9 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../core/src/core/core.module'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../core/src/core/github.helpers'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/src/tab-nav.service'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../git/src/shared/github.helpers'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundrySharedModule } from '../../../shared/cf-shared.module'; import { CfOrgSpaceDataService } from '../../../shared/data-services/cf-org-space-service.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.ts index ff481bc25d..8c8cdd5b8f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.component.ts @@ -2,8 +2,8 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { Observable, of as observableOf, Subscription } from 'rxjs'; -import { filter, map, tap } from 'rxjs/operators'; +import { Observable, of as observableOf, of, Subscription } from 'rxjs'; +import { filter, first, map, tap } from 'rxjs/operators'; import { DeleteDeployAppSection, @@ -22,6 +22,7 @@ import { RouterNav } from '../../../../../store/src/actions/router.actions'; import { selectPaginationState } from '../../../../../store/src/selectors/pagination.selectors'; import { CfAppsDataSource } from '../../../shared/components/list/list-types/app/cf-apps-data-source'; import { CfOrgSpaceDataService } from '../../../shared/data-services/cf-org-space-service.service'; +import { AUTO_SELECT_CF_URL_PARAM } from '../new-application-base-step/new-application-base-step.component'; import { ApplicationDeploySourceTypes } from './deploy-application-steps.types'; @Component({ @@ -40,7 +41,7 @@ export class DeployApplicationComponent implements OnInit, OnDestroy { deployButtonText = 'Deploy'; skipConfig$: Observable = observableOf(false); isRedeploy: boolean; - selectedSourceType: SourceType; + selectedSourceType$: Observable; entityKey: string; constructor( private store: Store, @@ -52,7 +53,7 @@ export class DeployApplicationComponent implements OnInit, OnDestroy { this.appGuid = this.activatedRoute.snapshot.queryParams.appGuid; this.isRedeploy = !!this.appGuid; - this.selectedSourceType = appDeploySourceTypes.getAutoSelectedType(activatedRoute); + this.selectedSourceType$ = appDeploySourceTypes.getAutoSelectedType(activatedRoute); this.skipConfig$ = this.store.select(selectApplicationSource).pipe( map((appSource: DeployApplicationSource) => { @@ -71,13 +72,18 @@ export class DeployApplicationComponent implements OnInit, OnDestroy { space: this.cfOrgSpaceService.space.select.getValue() })); return observableOf({ success: true }); - } + }; ngOnDestroy(): void { this.initCfOrgSpaceService.forEach(p => p.unsubscribe()); } ngOnInit(): void { + // Has the endpoint ID been specified in the URL? + const endpoint = this.activatedRoute.snapshot.queryParams[AUTO_SELECT_CF_URL_PARAM]; + if (endpoint) { + this.cfOrgSpaceService.cf.select.next(endpoint); + } if (this.appGuid) { this.deployButtonText = 'Redeploy'; @@ -117,12 +123,14 @@ export class DeployApplicationComponent implements OnInit, OnDestroy { } } - getTitle = () => { + getTitle = (): Observable => { if (this.appGuid) { - return 'Redeploy'; - } else { - return `Deploy ${this.selectedSourceType ? 'from ' + this.selectedSourceType.name : ''}`; + return of('Redeploy'); } - } + return this.selectedSourceType$.pipe( + first(), + map(selectedSourceType => `Deploy ${selectedSourceType ? 'from ' + selectedSourceType.name : ''}`) + ); + }; } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.spec.ts index de2ca64431..6dd665ad9c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.spec.ts @@ -5,11 +5,11 @@ import { inject, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; import { CoreModule } from '../../../../../core/src/core/core.module'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../core/src/core/github.helpers'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../git/src/shared/github.helpers'; +import { GitSCMService } from '../../../../../git/src/shared/scm/scm.service'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CFAppState } from '../../../cf-app-state'; -import { GitSCMService } from '../../../shared/data-services/scm/scm.service'; import { GithubProjectExistsDirective } from './github-project-exists.directive'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.ts index a053f51d2c..805731dc45 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/github-project-exists.directive.ts @@ -1,13 +1,13 @@ import { Directive, forwardRef, Input } from '@angular/core'; import { AbstractControl, NG_ASYNC_VALIDATORS, Validator } from '@angular/forms'; import { Store } from '@ngrx/store'; +import { GitSCMService, GitSCMType } from '@stratosui/git'; import { Observable, of as observableOf } from 'rxjs'; import { debounceTime, filter, first, map, tap } from 'rxjs/operators'; import { CheckProjectExists } from '../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { selectDeployAppState } from '../../../../../cloud-foundry/src/store/selectors/deploy-application.selector'; -import { GitSCMService, GitSCMType } from '../../../shared/data-services/scm/scm.service'; interface GithubProjectExistsResponse { githubProjectDoesNotExist: boolean; @@ -41,6 +41,16 @@ export class GithubProjectExistsDirective implements Validator { return this.lastValue.length && this.lastValue.indexOf(name) === 0; } + private getTypeAndEndpoint(): [GitSCMType, string] { + const res = this.appGithubProjectExists.split(','); + if (res.length === 2) { + return [res[0] as GitSCMType, res[1]]; + } + console.warn('appGithubProjectExists value should be `,'); + return null; + } + + validate(c: AbstractControl): Observable { if (c.value) { if (!this.isValidProjectName(c.value) || this.haveAlreadyChecked(c.value)) { @@ -54,7 +64,7 @@ export class GithubProjectExistsDirective implements Validator { debounceTime(250), tap(createAppState => { if (createAppState.projectExists && createAppState.projectExists.name !== c.value) { - this.store.dispatch(new CheckProjectExists(this.scmService.getSCM(this.appGithubProjectExists as GitSCMType), c.value)); + this.store.dispatch(new CheckProjectExists(this.scmService.getSCM(...this.getTypeAndEndpoint()), c.value)); } }), filter(createAppState => diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.html index d697a06e09..a076102dc9 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.html @@ -7,7 +7,8 @@

New Application

Select application source

To create an application you can either deploy from a specific source or create an application shell. An application shell is an empty application with no package associated with it.

- +
diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.ts index 24b9f15696..53853e78df 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/new-application-base-step/new-application-base-step.component.ts @@ -1,20 +1,28 @@ import { Component } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { BASE_REDIRECT_QUERY } from '../../../../../core/src/shared/components/stepper/stepper.types'; import { ITileConfig, ITileData } from '../../../../../core/src/shared/components/tile/tile-selector.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; -import { SourceType } from '../../../store/types/deploy-application.types'; import { ApplicationDeploySourceTypes, + AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM, AUTO_SELECT_DEPLOY_TYPE_URL_PARAM, } from '../deploy-application/deploy-application-steps.types'; -interface IAppTileData extends ITileData { +export const AUTO_SELECT_CF_URL_PARAM = 'auto-select-endpoint'; + + +export interface IAppTileData extends ITileData { type: string; subType?: string; + endpointGuid?: string; } + @Component({ selector: 'app-new-application-base-step', templateUrl: './new-application-base-step.component.html', @@ -23,19 +31,25 @@ interface IAppTileData extends ITileData { export class NewApplicationBaseStepComponent { public serviceType: string; - private sourceTypes: SourceType[]; - public tileSelectorConfig: ITileConfig[]; + public tileSelectorConfig$: Observable[]>; set selectedTile(tile: ITileConfig) { - const type = tile ? tile.data.type : null; if (tile) { const baseUrl = 'applications'; + const type = tile.data.type; const query = { [BASE_REDIRECT_QUERY]: `${baseUrl}/new` }; if (tile.data.subType) { query[AUTO_SELECT_DEPLOY_TYPE_URL_PARAM] = tile.data.subType; + query[AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM] = tile.data.endpointGuid; } + const endpoint = this.activatedRoute.snapshot.params.endpointId; + if (endpoint) { + query[AUTO_SELECT_CF_URL_PARAM] = endpoint; + query[BASE_REDIRECT_QUERY] += `/${endpoint}`; + } + this.store.dispatch(new RouterNav({ path: `${baseUrl}/${type}`, query @@ -45,21 +59,26 @@ export class NewApplicationBaseStepComponent { constructor( private store: Store, - appDeploySourceTypes: ApplicationDeploySourceTypes) { - this.sourceTypes = appDeploySourceTypes.getTypes(); - this.tileSelectorConfig = [ - ...this.sourceTypes.map(type => - new ITileConfig( - type.name, - type.graphic, - { type: 'deploy', subType: type.id }, - ), - ), - new ITileConfig( - 'Application Shell', - { matIcon: 'border_clear' }, - { type: 'create' } - ) - ]; + appDeploySourceTypes: ApplicationDeploySourceTypes, + private activatedRoute: ActivatedRoute, + ) { + this.tileSelectorConfig$ = appDeploySourceTypes.types$.pipe( + map(types => { + return [ + ...types.map(type => + new ITileConfig( + type.name, + type.graphic, + { type: 'deploy', subType: type.id, endpointGuid: type.endpointGuid }, + ), + ), + new ITileConfig( + 'Application Shell', + { matIcon: 'border_clear' }, + { type: 'create' } + ) + ]; + }) + ); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts index 0b3902f107..bcc986dd96 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts @@ -163,7 +163,7 @@ export class AddRoutesComponent implements OnInit, OnDestroy { } else { return this.mapRouteSubmit(); } - } + }; onSubmit(): Observable { const domainGuid = this.domainFormGroup.value.domain.metadata.guid; @@ -231,7 +231,7 @@ export class AddRoutesComponent implements OnInit, OnDestroy { if (requestState.error) { return { success: false, message: `Failed to associate route with app: ${requestState.error}` }; } - cfEntityCatalog.route.api.getAllForApplication(this.appGuid, this.cfGuid) + cfEntityCatalog.route.api.getAllForApplication(this.appGuid, this.cfGuid); this.store.dispatch(new RouterNav({ path: ['/applications', this.cfGuid, this.appGuid, 'routes'] })); return { success: true }; }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/add-organization/create-organization-step/create-organization-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/add-organization/create-organization-step/create-organization-step.component.ts index c13b3bdef2..acacd4fc2d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/add-organization/create-organization-step/create-organization-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/add-organization/create-organization-step/create-organization-step.component.ts @@ -85,15 +85,15 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { }); } }) - ) + ); this.orgSubscription = this.orgs$.subscribe(); } nameTakenValidator = (): ValidatorFn => { - return (formField: AbstractControl): { [key: string]: any } => + return (formField: AbstractControl): { [key: string]: any, } => !this.validateNameTaken(formField.value) ? { nameTaken: { value: formField.value } } : null; - } + }; validateNameTaken = (value: string = null) => this.allOrgs ? this.allOrgs.indexOf(value || this.orgName.value) === -1 : true; @@ -113,7 +113,7 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { message: requestInfo.error ? `Failed to create organization: ${requestInfo.message}` : '' })) ); - } + }; ngOnDestroy() { this.orgSubscription.unsubscribe(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/add-space/create-space-step/create-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/add-space/create-space-step/create-space-step.component.ts index 5f85a93af3..c5d20a4a05 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/add-space/create-space-step/create-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/add-space/create-space-step/create-space-step.component.ts @@ -62,14 +62,14 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On validateNameTaken = (spaceName: string = null) => { return this.allSpacesInOrg ? this.allSpacesInOrg.indexOf(spaceName || this.spaceName.value) === -1 : true; - } + }; validate = () => !!this.createSpaceForm && this.createSpaceForm.valid; spaceNameTakenValidator = (): ValidatorFn => { - return (formField: AbstractControl): { [key: string]: any } => + return (formField: AbstractControl): { [key: string]: any, } => !this.validateNameTaken(formField.value) ? { spaceNameTaken: { value: formField.value } } : null; - } + }; submit: StepOnNextFunction = () => { const id = `${this.orgGuid}-${this.spaceName.value}`; @@ -86,7 +86,7 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On map(([, newS]) => newS), this.map('Failed to create space: ') ); - } + }; ngOnDestroy() { this.quotaSubscription.unsubscribe(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-section.module.ts b/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-section.module.ts index 688e900238..f8adc26ba8 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-section.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-section.module.ts @@ -10,6 +10,7 @@ import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { CFEndpointsListConfigService, } from '../../shared/components/list/list-types/cf-endpoints/cf-endpoints-list-config.service'; +import { CFHomeCardModule } from '../home/cfhome-card/cfhome-card.module'; import { AddOrganizationComponent } from './add-organization/add-organization.component'; import { CreateOrganizationStepComponent, @@ -138,7 +139,8 @@ import { RemoveUserComponent } from './users/remove-user/remove-user.component'; CloudFoundrySectionRoutingModule, RouterModule, NgxChartsModule, - CloudFoundrySharedModule + CloudFoundrySharedModule, + CFHomeCardModule, ], declarations: [ CloudFoundryBaseComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-tabs-base/cloud-foundry-tabs-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-tabs-base/cloud-foundry-tabs-base.component.ts index 2818e5005e..e4b2877b4a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-tabs-base/cloud-foundry-tabs-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/cloud-foundry-tabs-base/cloud-foundry-tabs-base.component.ts @@ -13,8 +13,8 @@ import { import { CurrentUserPermissionsService } from '../../../../../core/src/core/permissions/current-user-permissions.service'; import { environment } from '../../../../../core/src/environments/environment.prod'; import { IPageSideNavTab } from '../../../../../core/src/features/dashboard/page-side-nav/page-side-nav.component'; -import { FavoritesConfigMapper } from '../../../../../store/src/favorite-config-mapper'; import { UserFavoriteEndpoint } from '../../../../../store/src/types/user-favorites.types'; +import { UserFavoriteManager } from '../../../../../store/src/user-favorite-manager'; import { CfCurrentUserPermissions } from '../../../user-permissions/cf-user-permissions-checkers'; import { CloudFoundryEndpointService } from '../services/cloud-foundry-endpoint.service'; @@ -45,12 +45,12 @@ export class CloudFoundryTabsBaseComponent implements OnInit { public cfEndpointService: CloudFoundryEndpointService, private currentUserPermissionsService: CurrentUserPermissionsService, endpointsService: EndpointsService, - favoritesConfigMapper: FavoritesConfigMapper + userFavoriteManager: UserFavoriteManager ) { this.favorite$ = endpointsService.endpoints$.pipe( first(), map(endpoints => endpoints[this.cfEndpointService.cfGuid]), - map(endpoint => favoritesConfigMapper.getFavoriteEndpointFromEntity(endpoint)) + map(endpoint => userFavoriteManager.getFavoriteEndpointFromEntity(endpoint)) ); const firehoseHidden$ = this.currentUserPermissionsService diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/edit-space/edit-space-step/edit-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/edit-space/edit-space-step/edit-space-step.component.ts index b4930646e2..183a9523a6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/edit-space/edit-space-step/edit-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/edit-space/edit-space-step/edit-space-step.component.ts @@ -70,7 +70,7 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe .indexOf(spaceName ? spaceName : this.spaceName) === -1; } return true; - } + }; submit: StepOnNextFunction = () => { const spaceQuotaGuid = this.editSpaceForm.value.quotaDefinition; @@ -97,7 +97,7 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe return this.updateSpaceQuota(); }), ); - } + }; updateSpace() { return cfEntityCatalog.space.api.update(this.spaceGuid, this.cfGuid, { @@ -114,7 +114,7 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe const spaceQuotaGuid = this.editSpaceForm.value.quotaDefinition; const mon = spaceQuotaGuid ? cfEntityCatalog.spaceQuota.api.associateWithSpace(this.spaceGuid, this.cfGuid, spaceQuotaGuid) : - cfEntityCatalog.spaceQuota.api.disassociateFromSpace(this.spaceGuid, this.cfGuid, this.originalSpaceQuotaGuid) + cfEntityCatalog.spaceQuota.api.disassociateFromSpace(this.spaceGuid, this.cfGuid, this.originalSpaceQuotaGuid); return mon.pipe( pairwise(), filter(([oldS, newS]) => oldS.busy && !newS.busy), diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-endpoint.service.ts b/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-endpoint.service.ts index 2a26f72b91..58f5047596 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-endpoint.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-endpoint.service.ts @@ -134,6 +134,26 @@ export class CloudFoundryEndpointService { return fetchTotalResults(action, store, pmf); } + // Fetch the cound of organisations in a Cloud Foundry + public static fetchOrgCount(store: Store, pmf: PaginationMonitorFactory, cfGuid: string): Observable { + const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(cfGuid); + return fetchTotalResults(getAllOrgsAction, store, pmf); + } + + public static fetchOrgs(store: Store, pmf: PaginationMonitorFactory, cfGuid: string): + Observable[]> { + const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(cfGuid); + return getPaginationObservables>({ + store, + action: getAllOrgsAction, + paginationMonitor: pmf.create( + getAllOrgsAction.paginationKey, + cfEntityFactory(organizationEntityType), + getAllOrgsAction.flattenPagination + ) + }, getAllOrgsAction.flattenPagination).entities$; + } + constructor( public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private store: Store, @@ -141,10 +161,9 @@ export class CloudFoundryEndpointService { private pmf: PaginationMonitorFactory, ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; - this.cfEndpointEntityService = stratosEntityCatalog.endpoint.store.getEntityService(this.cfGuid); - this.cfInfoEntityService = cfEntityCatalog.cfInfo.store.getEntityService(this.cfGuid) + this.cfInfoEntityService = cfEntityCatalog.cfInfo.store.getEntityService(this.cfGuid); this.constructCoreObservables(); this.constructSecondaryObservable(); } @@ -152,16 +171,7 @@ export class CloudFoundryEndpointService { private constructCoreObservables() { this.endpoint$ = this.cfEndpointEntityService.waitForEntity$; - const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(this.cfGuid); - this.orgs$ = getPaginationObservables>({ - store: this.store, - action: getAllOrgsAction, - paginationMonitor: this.pmf.create( - getAllOrgsAction.paginationKey, - cfEntityFactory(organizationEntityType), - getAllOrgsAction.flattenPagination - ) - }, getAllOrgsAction.flattenPagination).entities$; + this.orgs$ = CloudFoundryEndpointService.fetchOrgs(this.store, this.pmf, this.cfGuid); this.info$ = this.cfInfoEntityService.waitForEntity$; diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-organization.service.ts b/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-organization.service.ts index 52db165c63..cef7cef7ad 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-organization.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/services/cloud-foundry-organization.service.ts @@ -97,7 +97,7 @@ export class CloudFoundryOrganizationService { } public deleteSpace(spaceGuid: string, orgGuid: string, endpointGuid: string) { - cfEntityCatalog.space.api.remove(spaceGuid, endpointGuid, { orgGuid }) + cfEntityCatalog.space.api.remove(spaceGuid, endpointGuid, { orgGuid }); } public fetchApps() { diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-base/cloud-foundry-organization-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-base/cloud-foundry-organization-base.component.ts index 682da43532..12948952ae 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-base/cloud-foundry-organization-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-base/cloud-foundry-organization-base.component.ts @@ -12,13 +12,11 @@ import { import { environment } from '../../../../../../../core/src/environments/environment.prod'; import { IPageSideNavTab } from '../../../../../../../core/src/features/dashboard/page-side-nav/page-side-nav.component'; import { IHeaderBreadcrumb } from '../../../../../../../core/src/shared/components/page-header/page-header.types'; -import { FavoritesConfigMapper } from '../../../../../../../store/src/favorite-config-mapper'; import { EntitySchema } from '../../../../../../../store/src/helpers/entity-schema'; -import { UserFavorite } from '../../../../../../../store/src/types/user-favorites.types'; -import { getFavoriteFromEntity } from '../../../../../../../store/src/user-favorite-helpers'; +import { IFavoriteMetadata, UserFavorite } from '../../../../../../../store/src/types/user-favorites.types'; +import { UserFavoriteManager } from '../../../../../../../store/src/user-favorite-manager'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { organizationEntityType } from '../../../../../cf-entity-types'; -import { IOrgFavMetadata } from '../../../../../cf-metadata-types'; import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CfUserService } from '../../../../../shared/data-services/cf-user.service'; import { @@ -89,17 +87,17 @@ export class CloudFoundryOrganizationBaseComponent { public extensionActions: StratosActionMetadata[] = getActionsFromExtensions(StratosActionType.CloudFoundryOrg); - public favorite$: Observable>; + public favorite$: Observable>; constructor( public cfEndpointService: CloudFoundryEndpointService, public cfOrgService: CloudFoundryOrganizationService, - favoritesConfigMapper: FavoritesConfigMapper + userFavoriteManager: UserFavoriteManager ) { this.schema = cfEntityFactory(organizationEntityType); this.favorite$ = cfOrgService.org$.pipe( first(), - map(org => getFavoriteFromEntity(org.entity, organizationEntityType, favoritesConfigMapper, CF_ENDPOINT_TYPE)) + map(org => userFavoriteManager.getFavorite(org.entity, organizationEntityType, CF_ENDPOINT_TYPE)) ); this.name$ = cfOrgService.org$.pipe( map(org => org.entity.entity.name), diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts index c1cea96630..89b6fb7ec1 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts @@ -15,9 +15,8 @@ import { IPageSideNavTab } from '../../../../../../../../core/src/features/dashb import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { IHeaderBreadcrumb } from '../../../../../../../../core/src/shared/components/page-header/page-header.types'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; -import { FavoritesConfigMapper } from '../../../../../../../../store/src/favorite-config-mapper'; import { UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; -import { getFavoriteFromEntity } from '../../../../../../../../store/src/user-favorite-helpers'; +import { UserFavoriteManager } from '../../../../../../../../store/src/user-favorite-manager'; import { CFAppState } from '../../../../../../cf-app-state'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { spaceEntityType } from '../../../../../../cf-entity-types'; @@ -112,10 +111,10 @@ export class CloudFoundrySpaceBaseComponent implements OnDestroy { public cfOrgService: CloudFoundryOrganizationService, private store: Store, private confirmDialog: ConfirmationDialogService, - favoritesConfigMapper: FavoritesConfigMapper + userFavoriteManager: UserFavoriteManager ) { this.favorite$ = cfSpaceService.space$.pipe( - map(space => getFavoriteFromEntity(space.entity, spaceEntityType, favoritesConfigMapper, CF_ENDPOINT_TYPE)) + map(space => userFavoriteManager.getFavorite(space.entity, spaceEntityType, CF_ENDPOINT_TYPE)) ); this.isFetching$ = cfSpaceService.space$.pipe( map(space => space.entityRequestInfo.fetching) diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.html b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.html index 3f8bab4fa0..355e1f50c8 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.html @@ -75,7 +75,8 @@ + [endpoint]="cfEndpointService.cfGuid" + [loading$]="cfSpaceService.loadingApps$" (refresh)="cfSpaceService.fetchApps()"> diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts index 9b1935631e..e973d6b546 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts @@ -6,12 +6,6 @@ import { generateCfBaseTestModules, } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundrySpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; -import { - CardCfRecentAppsComponent, -} from '../../../../../../../shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component'; -import { - CompactAppCardComponent, -} from '../../../../../../../shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CardCfSpaceDetailsComponent, } from '../../../../../../../shared/components/cards/card-cf-space-details/card-cf-space-details.component'; @@ -22,6 +16,10 @@ import { import { CloudFoundryUserProvidedServicesService, } from '../../../../../../../shared/services/cloud-foundry-user-provided-services.service'; +import { CardCfRecentAppsComponent } from '../../../../../../home/card-cf-recent-apps/card-cf-recent-apps.component'; +import { + CompactAppCardComponent, +} from '../../../../../../home/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CloudFoundryEndpointService } from '../../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../../../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.html b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.html index c0b58c00cd..7f08c97325 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.html @@ -75,6 +75,7 @@ diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.spec.ts index 639ae6ff62..ea18e34694 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cf-organization-summary/cloud-foundry-organization-summary.component.spec.ts @@ -11,13 +11,9 @@ import { import { CardCfOrgUserDetailsComponent, } from '../../../../../shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component'; -import { - CardCfRecentAppsComponent, -} from '../../../../../shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component'; -import { - CompactAppCardComponent, -} from '../../../../../shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CfUserPermissionDirective } from '../../../../../shared/directives/cf-user-permission/cf-user-permission.directive'; +import { CardCfRecentAppsComponent } from '../../../../home/card-cf-recent-apps/card-cf-recent-apps.component'; +import { CompactAppCardComponent } from '../../../../home/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry-organization.service'; import { CloudFoundryOrganizationSummaryComponent } from './cloud-foundry-organization-summary.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.html b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.html index 3f84dbd35e..fbf1e13256 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.html @@ -1,11 +1,11 @@
- +
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.spec.ts index ec94265165..3c837c672c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.spec.ts @@ -5,7 +5,6 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfOrgsListConfigService } from '../../../../shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service'; import { CloudFoundryOrganizationsComponent } from './cloud-foundry-organizations.component'; describe('CloudFoundryOrganizationsComponent', () => { @@ -15,7 +14,7 @@ describe('CloudFoundryOrganizationsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [CloudFoundryOrganizationsComponent], - providers: [CfOrgsListConfigService, generateTestCfEndpointServiceProvider(), TabNavService], + providers: [generateTestCfEndpointServiceProvider(), TabNavService], imports: generateCfBaseTestModules() }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.ts index 479d1c9618..42ffcb4f36 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-organizations/cloud-foundry-organizations.component.ts @@ -1,10 +1,16 @@ import { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/permissions/current-user-permissions.service'; -import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; +import { + ActionListConfigProvider, +} from '../../../../../../core/src/shared/components/list/list-generics/list-providers/action-list-config-provider'; +import { ListViewTypes } from '../../../../../../core/src/shared/components/list/list.component.types'; +import { ListView } from '../../../../../../store/src/actions/list.actions'; +import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IOrganization } from '../../../../cf-api.types'; import { CfOrgCardComponent } from '../../../../shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component'; -import { CfOrgsListConfigService } from '../../../../shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service'; import { CfCurrentUserPermissions } from '../../../../user-permissions/cf-user-permissions-checkers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; @@ -12,20 +18,59 @@ import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoi selector: 'app-cloud-foundry-organizations', templateUrl: './cloud-foundry-organizations.component.html', styleUrls: ['./cloud-foundry-organizations.component.scss'], - providers: [ - { - provide: ListConfig, - useClass: CfOrgsListConfigService - } - ] }) export class CloudFoundryOrganizationsComponent { public canAddOrg$: Observable; + + public provider: ActionListConfigProvider>; + constructor( public cfEndpointService: CloudFoundryEndpointService, - currentUserPermissionsService: CurrentUserPermissionsService + currentUserPermissionsService: CurrentUserPermissionsService, + private store: Store, ) { this.canAddOrg$ = currentUserPermissionsService.can(CfCurrentUserPermissions.ORGANIZATION_CREATE, this.cfEndpointService.cfGuid); + + this.provider = this.createProvider(this.cfEndpointService.cfGuid); + } + + private createProvider(cfGuid: string): ActionListConfigProvider> { + const action = CloudFoundryEndpointService.createGetAllOrganizations(cfGuid); + const provider = new ActionListConfigProvider>(this.store, action); + + provider.updateListConfig({ + cardComponent: CfOrgCardComponent, + viewType: ListViewTypes.CARD_ONLY, + defaultView: 'cards' as ListView, + getColumns: () => [{ + columnId: 'name', + headerCell: () => 'Name', + sort: { + type: 'sort', + orderKey: 'name', + field: 'entity.name' + } + }, { + columnId: 'createdAt', + headerCell: () => 'Creation', + sort: { + type: 'sort', + orderKey: 'createdAt', + field: 'metadata.created_at' + }, + }], + text: { + title: null, + filter: 'Search by name', + noEntries: 'There are no organizations' + }, + }); + + provider.updateDataSourceConfig({ + transformEntities: [{ type: 'filter', field: 'entity.name' }] // Note - this will go away once fixed in default case + }); + + return provider; } - cardComponent = CfOrgCardComponent; } + diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-quotas/cloud-foundry-quotas.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-quotas/cloud-foundry-quotas.component.spec.ts index 8e5c68629e..55eb8c7472 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-quotas/cloud-foundry-quotas.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-quotas/cloud-foundry-quotas.component.spec.ts @@ -4,7 +4,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../core/src/tab-nav.service'; import { CFBaseTestModules } from '../../../../../test-framework/cf-test-helper'; import { generateTestCfEndpointServiceProvider } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfOrgsListConfigService } from '../../../../shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service'; import { CloudFoundryQuotasComponent } from './cloud-foundry-quotas.component'; describe('CloudFoundryQuotasComponent', () => { @@ -14,7 +13,7 @@ describe('CloudFoundryQuotasComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [CloudFoundryQuotasComponent], - providers: [CfOrgsListConfigService, generateTestCfEndpointServiceProvider(), TabNavService, DatePipe], + providers: [generateTestCfEndpointServiceProvider(), TabNavService, DatePipe], imports: [...CFBaseTestModules] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.html b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.html index 00060a2ab9..a45b8fd8f4 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.html @@ -34,6 +34,7 @@ diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.spec.ts index 9c459b2db9..bb055e4564 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/tabs/cf-summary-tab/cloud-foundry-summary-tab.component.spec.ts @@ -6,12 +6,8 @@ import { generateTestCfEndpointServiceProvider, } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CardCfInfoComponent } from '../../../../shared/components/cards/card-cf-info/card-cf-info.component'; -import { - CardCfRecentAppsComponent, -} from '../../../../shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component'; -import { - CompactAppCardComponent, -} from '../../../../shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component'; +import { CardCfRecentAppsComponent } from '../../../home/card-cf-recent-apps/card-cf-recent-apps.component'; +import { CompactAppCardComponent } from '../../../home/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CloudFoundrySummaryTabComponent } from './cloud-foundry-summary-tab.component'; describe('CloudFoundrySummaryTabComponent', () => { diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/user-invites/user-invite.service.ts b/src/frontend/packages/cloud-foundry/src/features/cf/user-invites/user-invite.service.ts index da7ba84675..6ebb948cbc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/user-invites/user-invite.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/user-invites/user-invite.service.ts @@ -49,7 +49,7 @@ export enum UserInviteSendSpaceRoles { interface UserInviteSend { org: string; space: string; - spaceRoles: { [spaceRole: string]: boolean }; + spaceRoles: { [spaceRole: string]: boolean, }; emails: string[]; } @@ -69,7 +69,7 @@ export class UserInviteConfigureService { const url = `/pp/${proxyAPIVersion}/invite/${cfGUID}`; const obs$ = this.http.post(url, formData).pipe( map(v => { - stratosEntityCatalog.systemInfo.api.getSystemInfo() + stratosEntityCatalog.systemInfo.api.getSystemInfo(); return { error: false }; @@ -98,7 +98,7 @@ export class UserInviteConfigureService { const url = `/pp/${proxyAPIVersion}/invite/${cfGUID}`; this.http.delete(url).pipe( map(v => { - stratosEntityCatalog.systemInfo.api.getSystemInfo() + stratosEntityCatalog.systemInfo.api.getSystemInfo(); return { error: false, errorMessage: '' diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/cf-roles.service.ts b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/cf-roles.service.ts index db59e58a77..6f1ee1d29d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/cf-roles.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/cf-roles.service.ts @@ -43,7 +43,7 @@ export class CfRolesService { existingRoles$: Observable; newRoles$: Observable; loading$: Observable; - cfOrgs: { [cfGuid: string]: Observable[]> } = {}; + cfOrgs: { [cfGuid: string]: Observable[]>, } = {}; /** * Given a list of orgs or spaces remove those that the connected user cannot edit roles in. @@ -79,7 +79,7 @@ export class CfRolesService { guid: string, cfGuid: string, orgGuid: string, - spaceGuid): Observable<{ guid: string, canEdit: boolean }> { + spaceGuid): Observable<{ guid: string, canEdit: boolean, }> { return canUpdateOrgSpaceRoles(userPerms, cfGuid, orgGuid, spaceGuid).pipe( first(), map(canEdit => ({ guid, canEdit })) @@ -137,7 +137,7 @@ export class CfRolesService { } private populateUserRoles(user: APIResource, roles: CfUserRolesSelected) { - const mappedUser: { [orgGuid: string]: IUserPermissionInOrg } = {}; + const mappedUser: { [orgGuid: string]: IUserPermissionInOrg, } = {}; const orgRoles = this.cfUserService.getOrgRolesFromUser(user.entity); const spaceRoles = this.cfUserService.getSpaceRolesFromUser(user.entity); // ... populate org roles ... @@ -248,7 +248,7 @@ export class CfRolesService { createEntityRelationKey(organizationEntityType, spaceEntityType) ], populateMissing: true } - ).entities$ + ).entities$; this.cfOrgs[cfGuid] = CfRolesService.filterEditableOrgOrSpace(this.userPerms, true, orgs$).pipe( map(orgs => orgs.sort((a, b) => a.entity.name.localeCompare(b.entity.name))), publishReplay(1), diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-modify/manage-users-modify.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-modify/manage-users-modify.component.ts index aec13ada83..4d1c3c269e 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-modify/manage-users-modify.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-modify/manage-users-modify.component.ts @@ -304,7 +304,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { this.store.select(selectCfUsersIsRemove).pipe(first()), this.cfRolesService.createRolesDiff(this.selectedOrgGuid) ]).pipe( - map(([isRemove,]) => { + map(([isRemove]) => { if (isRemove) { // If we're going to eventually remove the roles flip the add to remove this.store.dispatch(new UsersRolesFlipSetRoles()); diff --git a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts index 17365fc60e..51799bb57b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cf/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts @@ -89,7 +89,7 @@ export class ManageUsersSetUsernamesComponent implements OnInit { const canAddRemove = combineLatest([this.canAdd$, this.canRemove$]); // Set starting value of add/remove radio button - canAddRemove.pipe(first()).subscribe(([canAdd]) => this.setIsRemove({ source: null, value: !canAdd })) + canAddRemove.pipe(first()).subscribe(([canAdd]) => this.setIsRemove({ source: null, value: !canAdd })); // Block content until we know the add/remove state this.blocked$ = canAddRemove.pipe( @@ -136,5 +136,5 @@ export class ManageUsersSetUsernamesComponent implements OnInit { return of({ success: true }); - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.html b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.html new file mode 100644 index 0000000000..7c77d6d64c --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.html @@ -0,0 +1,30 @@ + + + + Recently updated applications + + + +
+ There are no applications. +
+
+ +
+
+
+
+ + + + + Recently updated applications + + +
+ +
+
+
+
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.scss b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.scss similarity index 70% rename from src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.scss rename to src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.scss index e6f70f9ab0..96249b7129 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.scss +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.scss @@ -1,9 +1,16 @@ +:host { + display: flex; +} .recent-apps-card { display: flex; flex-direction: column; height: 100%; width: 100%; + &__plain { + box-shadow: none; + } + &__content { display: flex; overflow-y: auto; @@ -14,7 +21,6 @@ flex: 1; height: 40px; justify-content: space-between; - padding-top: 0; mat-card-title { margin-bottom: 0; @@ -31,5 +37,10 @@ overflow-y: auto; width: 100%; } +} +// Remove box shadow in plain mode +mat-card.recent-apps-card.mat-card.recent-apps-card__plain { + box-shadow: none; + padding: 0 1em; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts similarity index 64% rename from src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts index b93ba4295a..53fbd7045f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.spec.ts @@ -3,21 +3,21 @@ import { of as observableOf } from 'rxjs'; import { ApplicationStateIconComponent, -} from '../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; +} from '../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; import { ApplicationStateIconPipe, -} from '../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.pipe'; +} from '../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.pipe'; import { PollingIndicatorComponent, -} from '../../../../../../core/src/shared/components/polling-indicator/polling-indicator.component'; -import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; +} from '../../../../../core/src/shared/components/polling-indicator/polling-indicator.component'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; +import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { generateActiveRouteCfOrgSpaceMock, generateCfBaseTestModulesNoShared, -} from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundryEndpointService } from '../../../../features/cf/services/cloud-foundry-endpoint.service'; -import { CfUserService } from '../../../data-services/cf-user.service'; +} from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfUserService } from '../../../shared/data-services/cf-user.service'; +import { CloudFoundryEndpointService } from '../../cf/services/cloud-foundry-endpoint.service'; import { CardCfRecentAppsComponent } from './card-cf-recent-apps.component'; import { CompactAppCardComponent } from './compact-app-card/compact-app-card.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.ts b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.ts new file mode 100644 index 0000000000..69179fc0f4 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/card-cf-recent-apps.component.ts @@ -0,0 +1,103 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs'; +import { filter, map, startWith, tap } from 'rxjs/operators'; + +import { PaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; +import { APIResource } from '../../../../../store/src/types/api.types'; +import { IApp } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { appDataSort } from '../../cf/services/cloud-foundry-endpoint.service'; + + +const RECENT_ITEMS_COUNT = 10; + +@Component({ + selector: 'app-card-cf-recent-apps', + templateUrl: './card-cf-recent-apps.component.html', + styleUrls: ['./card-cf-recent-apps.component.scss'], +}) +export class CardCfRecentAppsComponent implements OnInit { + + public recentApps$: Observable[]>; + @Input() allApps$: Observable[]>; + @Input() loading$: Observable; + @Output() refresh = new EventEmitter(); + @Input() endpoint: string; + @Input() mode: string; + @Input() showDate = true; + @Input() dateMode: string; + @Input() noStats = false; + @Input() placeholderMode = false; + @Input() hideWhenEmpty = false; + + public canRefresh = false; + + public placeholders: any[]; + + appsPagObs: PaginationObservables>; + + hasEntities$: Observable; + show$: Observable; + + private maxRowsSubject = new BehaviorSubject(RECENT_ITEMS_COUNT); + + @Input() set maxRows(value: number) { + this.maxRowsSubject.next(value); + this.placeholders = new Array(value).fill(null); + } + + constructor() { + this.placeholders = new Array(RECENT_ITEMS_COUNT).fill(null); + } + + ngOnInit() { + if (this.placeholderMode) { + this.canRefresh = false; + this.hasEntities$ = of(false); + return; + } + this.canRefresh = this.refresh.observers.length > 0; + this.appsPagObs = cfEntityCatalog.application.store.getPaginationService(this.endpoint); + if (!this.allApps$) { + this.allApps$ = this.appsPagObs.entities$; + this.loading$ = this.appsPagObs.fetchingEntities$; + this.hasEntities$ = this.appsPagObs.hasEntities$; + } else { + this.hasEntities$ = of(true); + } + + this.recentApps$ = combineLatest( + this.allApps$, + this.maxRowsSubject.asObservable() + ).pipe( + filter(([apps]) => !!apps), + map(([apps, maxRows]) => this.restrictApps(apps, maxRows)), + tap(apps => this.fetchAppStats(apps)) + ); + + this.show$ = this.allApps$.pipe( + map(apps => { + return !this.hideWhenEmpty || this.hideWhenEmpty && apps.length > 0; + }), + startWith(true), + ); + } + + private fetchAppStats(recentApps: APIResource[]) { + if (!this.noStats) { + recentApps.forEach(app => { + if (app.entity.state === 'STARTED') { + cfEntityCatalog.appStats.api.getMultiple(app.metadata.guid, this.endpoint); + } + }); + } + } + + private restrictApps(apps: APIResource[], maxRows = RECENT_ITEMS_COUNT): APIResource[] { + if (!apps) { + return []; + } + return apps.sort(appDataSort).slice(0, maxRows); + } + +} diff --git a/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.html b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.html new file mode 100644 index 0000000000..06a1acd218 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.html @@ -0,0 +1,17 @@ +
+ + +
{{ app.metadata.updated_at | date:'medium' }}
+
+ + +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss new file mode 100644 index 0000000000..bb7def5219 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss @@ -0,0 +1,79 @@ +:host { + border: 1px solid #ccc; + display: flex; + padding: 0 12px; + + &:not(:first-child) { + border-top: 0; + } +} + +.compact-app-card { + align-items: center; + display: flex; + flex-direction: row; + font-size: 14px; + height: 40px; + width: 100%; + &__name { + flex: 1; + padding-left: 12px; + } + &__subtle { + font-size: 12px; + opacity: 0.7; + } +} + +$ph-bg: #fff !default; +$ph-color: #ced4da !default; +$ph-border-radius: 2px !default; + +$ph-gutter: 30px !default; +$ph-spacer: 15px !default; + +$ph-avatar-border-radius: 50% !default; + +$ph-animation-duration: .8s !default; + +.ph-item { + height: 14px; + background-color: #d8d8d8; + overflow: hidden; + position: relative; + + &::before { + animation: phAnimation $ph-animation-duration linear infinite; + background: linear-gradient(to right, rgba($ph-bg, 0) 46%, rgba($ph-bg, .35) 50%, rgba($ph-bg, 0) 54%) 50% 50%; + content: ''; + top: 0; + right: 0; + bottom: 0; + left: 50%; + z-index: 1; + width: 500%; + margin-left: -250%; + position: absolute; + } + + &.ph-large { + width: 120px; + } + &.ph-small { + width: 80px; + } + &.ph-icon { + border-radius: 50%; + height: 20px; + width: 20px; + } +} + +@keyframes phAnimation { + 0% { + transform: translate3d(-30%, 0, 0); + } + 100% { + transform: translate3d(30%, 0, 0); + } +} \ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts similarity index 69% rename from src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts index d6655a60b1..2f7bc155e6 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts @@ -2,13 +2,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ApplicationStateIconComponent, -} from '../../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; +} from '../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; import { ApplicationStateIconPipe, -} from '../../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.pipe'; -import { generateCfBaseTestModulesNoShared } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { ActiveRouteCfOrgSpace } from '../../../../../features/cf/cf-page.types'; -import { ApplicationStateService } from '../../../../services/application-state.service'; +} from '../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.pipe'; +import { generateCfBaseTestModulesNoShared } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../shared/services/application-state.service'; +import { ActiveRouteCfOrgSpace } from '../../../cf/cf-page.types'; import { CompactAppCardComponent } from './compact-app-card.component'; describe('CompactAppCardComponent', () => { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts similarity index 65% rename from src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts rename to src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts index 456ba80949..c78c819bd1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/home/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts @@ -3,12 +3,12 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; -import { BREADCRUMB_URL_PARAM } from '../../../../../../../core/src/shared/components/breadcrumbs/breadcrumbs.types'; -import { StratosStatus } from '../../../../../../../store/src/types/shared.types'; -import { ActiveRouteCfOrgSpace } from '../../../../../features/cf/cf-page.types'; -import { ApplicationStateData, ApplicationStateService } from '../../../../services/application-state.service'; +import { BREADCRUMB_URL_PARAM } from '../../../../../../core/src/shared/components/breadcrumbs/breadcrumbs.types'; +import { StratosStatus } from '../../../../../../store/src/types/shared.types'; +import { CFAppState } from '../../../../cf-app-state'; +import { ApplicationStateData, ApplicationStateService } from '../../../../shared/services/application-state.service'; +import { ApplicationService } from '../../../applications/application.service'; +import { ActiveRouteCfOrgSpace } from '../../../cf/cf-page.types'; @Component({ @@ -20,6 +20,11 @@ export class CompactAppCardComponent implements OnInit { @Input() app; + @Input() endpoint: string; + + @Input() showDate = true; + @Input() dateMode: string; + applicationState$: Observable; appStatus$: Observable; @@ -34,14 +39,23 @@ export class CompactAppCardComponent implements OnInit { ) { } ngOnInit() { + if (this.activeRouteCfOrgSpace) { + this.bcType = this.setBreadcrumbType(this.activeRouteCfOrgSpace); + if (!this.endpoint) { + this.endpoint = this.activeRouteCfOrgSpace.cfGuid; + } + } + + if (!this.app) { + return; + } - this.bcType = this.setBreadcrumbType(this.activeRouteCfOrgSpace); const initState = this.appStateService.get(this.app.entity, null); this.applicationState$ = ApplicationService.getApplicationState( this.appStateService, this.app.entity, this.app.metadata.guid, - this.activeRouteCfOrgSpace.cfGuid + this.endpoint ).pipe( startWith(initState) ); diff --git a/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.html b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.html new file mode 100644 index 0000000000..6a65b9bcb5 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + +
+ apps +
You don't have any applications
+
+
Get started by deploying an Application from ...
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.scss b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.scss new file mode 100644 index 0000000000..85cb520946 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.scss @@ -0,0 +1,30 @@ +.cf-home-card { + &__plain-tiles { + margin-left: 0; + margin-right: 1em; + margin-top: 1em; + } + &__no-apps { + align-items: center; + display: flex; + flex-direction: column; + margin-top: 20px; + opacity: 0.7; + > mat-icon { + font-size: 48px; + height: 48px; + width: 48px; + } + &-title { + font-size: 16px; + margin: 10px 8px; + text-align: center; + } + &-deploy { + font-size: 16px; + font-weight: bold; + margin: 20px 0; + text-align: center; + } + } +} diff --git a/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.spec.ts new file mode 100644 index 0000000000..87195f96e6 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.spec.ts @@ -0,0 +1,31 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationDeploySourceTypes } from '../../applications/deploy-application/deploy-application-steps.types'; +import { CFHomeCardComponent } from './cfhome-card.component'; + +describe('CFHomeCardComponent', () => { + let component: CFHomeCardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CFHomeCardComponent ], + imports: generateCfBaseTestModules(), + providers: [ + ApplicationDeploySourceTypes + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CFHomeCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.ts b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.ts new file mode 100644 index 0000000000..b6c063f1d0 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.component.ts @@ -0,0 +1,202 @@ +import { Component, Input } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; +import { filter, first, map, pairwise } from 'rxjs/operators'; + +import { BASE_REDIRECT_QUERY } from '../../../../../core/src/shared/components/stepper/stepper.types'; +import { RouterNav } from '../../../../../store/src/actions/router.actions'; +import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; +import { EndpointModel } from '../../../../../store/src/public-api'; +import { ActionState } from '../../../../../store/src/reducers/api-request-reducer/types'; +import { APIResource } from '../../../../../store/src/types/api.types'; +import { IApp } from '../../../cf-api.types'; +import { CFAppState } from '../../../cf-app-state'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { + ApplicationDeploySourceTypes, + AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM, + AUTO_SELECT_DEPLOY_TYPE_URL_PARAM, +} from '../../applications/deploy-application/deploy-application-steps.types'; +import { + AUTO_SELECT_CF_URL_PARAM, + IAppTileData, +} from '../../applications/new-application-base-step/new-application-base-step.component'; +import { ActiveRouteCfOrgSpace } from '../../cf/cf-page.types'; +import { goToAppWall } from '../../cf/cf.helpers'; +import { appDataSort, CloudFoundryEndpointService } from '../../cf/services/cloud-foundry-endpoint.service'; +import { HomePageCardLayout, HomePageEndpointCard } from './../../../../../core/src/features/home/home.types'; +import { ITileConfig } from './../../../../../core/src/shared/components/tile/tile-selector.types'; + + +@Component({ + selector: 'app-cfhome-card', + templateUrl: './cfhome-card.component.html', + styleUrls: ['./cfhome-card.component.scss'], + providers: [ + { + provide: ActiveRouteCfOrgSpace, + useValue: null, + }, + CloudFoundryEndpointService + ] +}) +export class CFHomeCardComponent implements HomePageEndpointCard { + + pLayout: HomePageCardLayout; + + get layout(): HomePageCardLayout { + return this.pLayout; + } + + @Input() set layout(value: HomePageCardLayout) { + if (value) { + this.pLayout = value; + } + this.updateLayout(); + } + + @Input() set endpoint(value: EndpointModel) { + this.guid = value.guid; + } + + guid: string; + + recentAppsRows = 10; + + appLink: () => void; + + appCount$: Observable; + orgCount$: Observable; + routeCount$: Observable; + + hasNoApps$: Observable; + + cardLoaded = false; + + recentApps = []; + + private appStatsLoaded = new BehaviorSubject(false); + private appStatsToLoad: APIResource[] = []; + + public tileSelectorConfig$: Observable[]>; + + showDeployAppTiles = false; + + constructor( + private store: Store, + private pmf: PaginationMonitorFactory, + appDeploySourceTypes: ApplicationDeploySourceTypes, + ) { + // Set a default layout + this.pLayout = new HomePageCardLayout(1, 1); + + // Get source types for if we are showing tiles to deploy an application + this.tileSelectorConfig$ = appDeploySourceTypes.types$.pipe( + map(types => types.map(type => + new ITileConfig( + type.name, + type.graphic, + { + type: 'deploy', + subType: type.id, + endpointGuid: type.endpointGuid + }, + ) + )) + ); + } + + // Deploy an app from the Home Card for the given endpoint + set selectedTile(tile: ITileConfig) { + const type = tile ? tile.data.type : null; + if (tile) { + const query = { + [BASE_REDIRECT_QUERY]: `applications/new/${this.guid}`, + [AUTO_SELECT_CF_URL_PARAM]: this.guid + }; + if (tile.data.subType) { + query[AUTO_SELECT_DEPLOY_TYPE_URL_PARAM] = tile.data.subType; + } + if (tile.data.endpointGuid) { + query[AUTO_SELECT_DEPLOY_TYPE_ENDPOINT_PARAM] = tile.data.endpointGuid; + } + this.store.dispatch(new RouterNav({ path: `applications/${type}`, query })); + } + } + + // Card is instructed to load its view by the container, whn it is visible + load(): Observable { + this.cardLoaded = true; + this.routeCount$ = CloudFoundryEndpointService.fetchRouteCount(this.store, this.pmf, this.guid); + this.appCount$ = CloudFoundryEndpointService.fetchAppCount(this.store, this.pmf, this.guid); + this.orgCount$ = CloudFoundryEndpointService.fetchOrgCount(this.store, this.pmf, this.guid); + + this.appLink = () => goToAppWall(this.store, this.guid); + + const appsPagObs = cfEntityCatalog.application.store.getPaginationService(this.guid); + + // When the apps are loaded, fetch the app stats + this.hasNoApps$ = appsPagObs.entities$.pipe(first(), map(apps => { + this.recentApps = apps; + this.appStatsToLoad = this.restrictApps(apps); + this.fetchAppStats(); + this.fetchAppStats(); + return apps.length === 0; + })); + + const appStatLoaded$ = this.appStatsLoaded.asObservable().pipe(filter(loaded => loaded)); + return combineLatest([ + this.routeCount$, + this.appCount$, + this.orgCount$, + appsPagObs.entities$, + appStatLoaded$ + ]).pipe( + map(() => true) + ); + } + + public updateLayout() { + const currentRows = this.recentAppsRows; + this.recentAppsRows = this.layout.y > 1 ? 5 : 10; + + // Hide recent apps if more than 2 columns + if (this.layout.x > 2) { + this.recentAppsRows = 0; + } + + // If the layout changes and there are apps to show then we need to fetch the app stats for them + if (this.recentAppsRows > currentRows) { + this.appStatsToLoad = this.restrictApps(this.recentApps); + this.fetchAppStats(); + } + + // Only show the deploy app tiles in the full view + this.showDeployAppTiles = this.layout.x === 1 && this.layout.y === 1; + } + + // Fetch the app stats - we fetch two at a time + private fetchAppStats() { + if (this.appStatsToLoad.length > 0) { + const app = this.appStatsToLoad.shift(); + if (app.entity.state === 'STARTED') { + cfEntityCatalog.appStats.api.getMultiple(app.metadata.guid, this.guid).pipe( + map(a => a as ActionState), + pairwise(), + filter(([oldR, newR]) => oldR.busy && !newR.busy), + first() + ).subscribe(a => { + this.fetchAppStats(); + }); + } else { + this.fetchAppStats(); + } + } else { + this.appStatsLoaded.next(true); + } + } + + private restrictApps(apps: APIResource[]): APIResource[] { + return !apps ? [] : [...apps.sort(appDataSort).slice(0, this.recentAppsRows)]; + } +} diff --git a/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.module.ts b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.module.ts new file mode 100644 index 0000000000..c9bd1f1179 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/home/cfhome-card/cfhome-card.module.ts @@ -0,0 +1,42 @@ +import { ComponentFactoryResolver, NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { CoreModule } from '../../../../../core/src/core/core.module'; +import { HomeModule } from '../../../../../core/src/features/home/home.module'; +import { SharedModule } from '../../../../../core/src/public-api'; +import { ApplicationStateService } from '../../../shared/services/application-state.service'; +import { ApplicationDeploySourceTypes } from '../../applications/deploy-application/deploy-application-steps.types'; +import { CardCfRecentAppsComponent } from '../card-cf-recent-apps/card-cf-recent-apps.component'; +import { CompactAppCardComponent } from '../card-cf-recent-apps/compact-app-card/compact-app-card.component'; +import { MDAppModule } from './../../../../../core/src/core/md.module'; +import { CFHomeCardComponent } from './cfhome-card.component'; + +@NgModule({ + imports: [ + CoreModule, + RouterModule, + MDAppModule, + SharedModule, + HomeModule, + ], + declarations: [ + CFHomeCardComponent, + CardCfRecentAppsComponent, + CompactAppCardComponent, + ], + exports: [ + CFHomeCardComponent, + CardCfRecentAppsComponent, + CompactAppCardComponent, + ], + providers: [ + ApplicationStateService, + ApplicationDeploySourceTypes, + ] +}) +export class CFHomeCardModule { + + public createHomeCard(componentFactoryResolver: ComponentFactoryResolver) { + return componentFactoryResolver.resolveComponentFactory(CFHomeCardComponent); + } +} diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-tabs-base/service-tabs-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-tabs-base/service-tabs-base.component.ts index 763af35529..085149bb4f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-tabs-base/service-tabs-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-tabs-base/service-tabs-base.component.ts @@ -68,18 +68,18 @@ export class ServiceTabsBaseComponent { ...queryParams, [CSI_CANCEL_URL]: `/marketplace/${this.servicesService.cfGuid}/${this.servicesService.serviceGuid}/instances` })) - ) + ); this.addServiceInstanceLink = [ '/marketplace', this.servicesService.cfGuid, this.servicesService.serviceGuid, 'create' - ] + ]; this.serviceLabel$ = this.servicesService.service$.pipe( map(getServiceName), publishReplay(1), refCount() - ) + ); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts index 21db362ed1..f6d14ee8df 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts @@ -80,7 +80,7 @@ export const fetchServiceInstancesCount = ( cfGuid, createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), { includeRelations: [], populateMissing: false } - ) + ); if (orgGuid) { action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); } @@ -121,7 +121,7 @@ export const getServicePlans = ( })); }; -export const getServicePlanName = (plan: { name: string, extraTyped?: IServicePlanExtra }): string => +export const getServicePlanName = (plan: { name: string, extraTyped?: IServicePlanExtra, }): string => plan.extraTyped && plan.extraTyped.displayName ? plan.extraTyped.displayName : plan.name; export const getServicePlanAccessibility = ( @@ -205,5 +205,5 @@ export const getCfServiceInstance = ( includeRelations, populateMissing: !!includeRelations } - ) + ); }; diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts index 05d65754d3..114a8e3075 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts @@ -72,11 +72,11 @@ export class ServicesService { filter(s => s && s.length === 1), map(s => s[0]), first() - ) + ); getServiceName = () => this.service$.pipe( map(getServiceName) - ) + ); getServiceProviderName = () => observableCombineLatest(this.serviceExtraInfo$, this.service$).pipe( map(([extraInfo]) => extraInfo && extraInfo.providerDisplayName ? extraInfo.providerDisplayName : '') @@ -88,19 +88,19 @@ export class ServicesService { getDocumentationUrl = () => this.serviceExtraInfo$.pipe( map(p => p ? p.documentationUrl : null) - ) + ); getSupportUrl = () => this.serviceExtraInfo$.pipe( map(p => p ? p.supportUrl : null) - ) + ); hasSupportUrl = () => this.getSupportUrl().pipe( map(p => !!p) - ) + ); hasDocumentationUrl = () => this.getDocumentationUrl().pipe( map(p => !!p) - ) + ); getServiceTags = () => this.service$.pipe( first(), @@ -110,7 +110,7 @@ export class ServicesService { hideClearButton$: observableOf(true) })) ) - ) + ); /** * Init observables specific to a service diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.html b/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.html index b47b7c7e12..d188fc7735 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.html @@ -26,5 +26,6 @@

Services

\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.ts b/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.ts index be3e78240d..05f0c8b613 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/services-wall/services-wall.component.ts @@ -1,17 +1,13 @@ -import { Component, OnDestroy } from '@angular/core'; +import { Component } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { serviceInstancesEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { ServiceInstancesWallListConfigService, } from '../../../../../cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service'; -import { - CfOrgSpaceDataService, - initCfOrgSpaceService, -} from '../../../../../cloud-foundry/src/shared/data-services/cf-org-space-service.service'; +import { CfOrgSpaceDataService } from '../../../../../cloud-foundry/src/shared/data-services/cf-org-space-service.service'; import { CloudFoundryService } from '../../../../../cloud-foundry/src/shared/data-services/cloud-foundry.service'; import { ListConfig } from '../../../../../core/src/shared/components/list/list.component.types'; import { CSI_CANCEL_URL } from '../../../shared/components/add-service-instance/csi-mode.service'; @@ -29,19 +25,19 @@ import { CfCurrentUserPermissions } from '../../../user-permissions/cf-user-perm CfOrgSpaceDataService ] }) -export class ServicesWallComponent implements OnDestroy { +export class ServicesWallComponent { public haveConnectedCf$: Observable; canCreateServiceInstance: CfCurrentUserPermissions; initCfOrgSpaceService: Subscription; cfIds$: Observable; - location: { [CSI_CANCEL_URL]: string }; + location: { [CSI_CANCEL_URL]: string, }; constructor( public cloudFoundryService: CloudFoundryService, public store: Store, - private cfOrgSpaceService: CfOrgSpaceDataService) { + public cfOrgSpaceService: CfOrgSpaceDataService) { this.canCreateServiceInstance = CfCurrentUserPermissions.SERVICE_INSTANCE_CREATE; this.cfIds$ = cloudFoundryService.cFEndpoints$.pipe( @@ -51,21 +47,12 @@ export class ServicesWallComponent implements OnDestroy { ) ); - this.initCfOrgSpaceService = initCfOrgSpaceService(this.store, - this.cfOrgSpaceService, - serviceInstancesEntityType, - 'all').subscribe(); - this.haveConnectedCf$ = cloudFoundryService.connectedCFEndpoints$.pipe( map(endpoints => !!endpoints && endpoints.length > 0) ); this.location = { [CSI_CANCEL_URL]: `/services` - } - } - - ngOnDestroy(): void { - this.initCfOrgSpaceService.unsubscribe(); + }; } } diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts index eadc97f032..a9cbeff2b5 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts @@ -19,8 +19,8 @@ export class ServicesWallService { initServicesObservable = () => { const paginationKey = createEntityRelationPaginationKey(endpointEntityType); - return cfEntityCatalog.service.store.getPaginationService(null, paginationKey, {}).entities$ - } + return cfEntityCatalog.service.store.getPaginationService(null, paginationKey, {}).entities$; + }; getServicesInCf = (cfGuid: string) => this.services$.pipe( filter(p => !!p && p.length > 0), @@ -28,7 +28,7 @@ export class ServicesWallService { filter(p => !!p), publishReplay(1), refCount() - ) + ); getSpaceServicePagKey(cfGuid: string, spaceGuid: string) { return createEntityRelationPaginationKey(serviceEntityType, `${cfGuid}-${spaceGuid}`); @@ -37,5 +37,5 @@ export class ServicesWallService { getServicesInSpace = (cfGuid: string, spaceGuid: string) => { const paginationKey = this.getSpaceServicePagKey(cfGuid, spaceGuid); return cfEntityCatalog.service.store.getAllInSpace.getPaginationService(cfGuid, paginationKey, spaceGuid).entities$; - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/public_api.ts b/src/frontend/packages/cloud-foundry/src/public_api.ts index 0d517d9617..daa44ceb4e 100644 --- a/src/frontend/packages/cloud-foundry/src/public_api.ts +++ b/src/frontend/packages/cloud-foundry/src/public_api.ts @@ -5,4 +5,4 @@ export * from './cloud-foundry-package.module'; export * from './cloud-foundry-routing.module'; -export * from './cf-api-svc.types'; \ No newline at end of file +export * from './cf-api-svc.types'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/cf-shared.module.ts b/src/frontend/packages/cloud-foundry/src/shared/cf-shared.module.ts index 206abb267a..554586149c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/cf-shared.module.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/cf-shared.module.ts @@ -31,8 +31,6 @@ import { CardCfInfoComponent } from './components/cards/card-cf-info/card-cf-inf import { CardCfOrgUserDetailsComponent, } from './components/cards/card-cf-org-user-details/card-cf-org-user-details.component'; -import { CardCfRecentAppsComponent } from './components/cards/card-cf-recent-apps/card-cf-recent-apps.component'; -import { CompactAppCardComponent } from './components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component'; import { CardCfSpaceDetailsComponent } from './components/cards/card-cf-space-details/card-cf-space-details.component'; import { CardCfUserInfoComponent } from './components/cards/card-cf-user-info/card-cf-user-info.component'; import { @@ -54,7 +52,6 @@ import { CreateApplicationStep1Component, } from './components/create-application/create-application-step1/create-application-step1.component'; import { EnvVarViewComponent } from './components/env-var-view/env-var-view.component'; -import { GithubCommitAuthorComponent } from './components/github-commit-author/github-commit-author.component'; import { TableCellCfCellComponent, } from './components/list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component'; @@ -180,9 +177,6 @@ import { import { CfSpacePermissionCellComponent, } from './components/list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component'; -import { - TableCellCommitAuthorComponent, -} from './components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component'; import { TableCellAServicePlanExtrasComponent, } from './components/list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component'; @@ -250,7 +244,6 @@ const cfListTableCells: Type>[] = [ TableCellServiceActiveComponent, TableCellServiceReferencesComponent, TableCellServiceInstanceTagsComponent, - TableCellCommitAuthorComponent, TableCellServiceBrokerComponent ]; @@ -300,8 +293,6 @@ const cfListCards: Type>[] = [ CardCfUserInfoComponent, CardCfOrgUserDetailsComponent, CardCfSpaceDetailsComponent, - CardCfRecentAppsComponent, - CompactAppCardComponent, ServiceSummaryCardComponent, ServiceBrokerCardComponent, ServiceRecentInstancesCardComponent, @@ -319,7 +310,6 @@ const cfListCards: Type>[] = [ TableCellFeatureFlagDescriptionComponent, AppNameUniqueDirective, ApplicationInstanceChartComponent, - GithubCommitAuthorComponent, EnvVarViewComponent, CfUserPermissionDirective ], @@ -349,8 +339,6 @@ const cfListCards: Type>[] = [ CardCfUserInfoComponent, CardCfOrgUserDetailsComponent, CardCfSpaceDetailsComponent, - CardCfRecentAppsComponent, - CompactAppCardComponent, ServiceSummaryCardComponent, ServiceBrokerCardComponent, ServiceRecentInstancesCardComponent, @@ -362,7 +350,6 @@ const cfListCards: Type>[] = [ CloudFoundryEventsListComponent, AppNameUniqueDirective, ApplicationInstanceChartComponent, - GithubCommitAuthorComponent, EnvVarViewComponent, CfUserPermissionDirective ], diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component.ts index 2daa17cb4a..587b4043f9 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component.ts @@ -74,11 +74,11 @@ export class AddServiceInstanceBaseStepComponent { } private createServiceTileUrl(): string { - return this.bindApp ? `/applications/${this.cfId}/${this.appId}/bind` : '/services/new' + return this.bindApp ? `/applications/${this.cfId}/${this.appId}/bind` : '/services/new'; } private createCancelUrl(): string { - return this.bindApp ? `/applications/${this.cfId}/${this.appId}/services` : '/services' + return this.bindApp ? `/applications/${this.cfId}/${this.appId}/services` : '/services'; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts index ad65ce4410..588d129690 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts @@ -23,7 +23,7 @@ export const enum CreateServiceFormMode { * Where should the user be taken on cancel (and success). If not supplied will fall back on previous location and then deduced from * params */ -export const CSI_CANCEL_URL = 'cancel' +export const CSI_CANCEL_URL = 'cancel'; /** * Used when `CSI_CANCEL_URL` is not supplied diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts index ae2ed8a868..029efc2e84 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts @@ -104,9 +104,9 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit nameTakenValidator = (): ValidatorFn => { - return (formField: AbstractControl): { [key: string]: any } => + return (formField: AbstractControl): { [key: string]: any, } => !this.checkName(formField.value) ? { nameTaken: { value: formField.value } } : null; - } + }; constructor( private store: Store, @@ -212,7 +212,7 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit ).subscribe(); } this.subscriptions.push(this.setupFormValidatorData()); - } + }; setServiceParams(data) { this.serviceParams = data; @@ -232,7 +232,7 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit } else if (mode === CreateServiceFormMode.BindServiceInstance) { this.bindExistingInstance = true; } - } + }; private setupFormValidatorData(): Subscription { return this.allServiceInstances$.pipe( @@ -353,7 +353,7 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit return observableOf(this.routeToServices()); }), ); - } + }; routeToServices = (): StepOnNextResult => { return { @@ -361,10 +361,10 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit // We should always go back to where we came from, aka 'cancel' location. redirect: true, }; - } + }; - private setServiceInstanceGuid = (request: { creating: boolean; error: boolean; response: { result: any[]; }; }) => - this.bindExistingInstance ? this.selectExistingInstanceForm.controls.serviceInstances.value : request.response.result[0] + private setServiceInstanceGuid = (request: { creating: boolean; error: boolean; response: { result: any[], }, }) => + this.bindExistingInstance ? this.selectExistingInstanceForm.controls.serviceInstances.value : request.response.result[0]; private setupValidate() { // For a new service instance the step is valid if the form and service params are both valid @@ -418,13 +418,13 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit newServiceInstanceGuid, cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ) + ); } return cfEntityCatalog.serviceInstance.actions.create( newServiceInstanceGuid, cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ) + ); } private getIdFromResponseGetter(cfGuid: string, newId: string, isEditMode: boolean) { @@ -509,6 +509,6 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit return this.allServiceInstanceNames.indexOf(value || this.createNewInstanceForm.controls.name.value) === -1; } return true; - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts index 258727a9cc..bf23f3494c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts @@ -67,7 +67,7 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { public allServiceInstanceNames: string[]; public subs: Subscription[] = []; public isUpdate: boolean; - public tags: { label: string }[] = []; + public tags: { label: string, }[] = []; public valid = new BehaviorSubject(false); private subscriptions: Subscription[] = []; private tagsChanged = new BehaviorSubject(true); @@ -170,7 +170,7 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { if (mode === CreateServiceFormMode.CreateServiceInstance) { this.tags = []; } - } + }; private serviceInstancesForApplication() { return this.store.select(selectCreateServiceInstance).pipe( @@ -237,13 +237,13 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { params }, ); - } + }; public onNext = (): Observable => { return this.isUpdate ? this.onNextUpdate() : this.formMode === CreateServiceFormMode.CreateServiceInstance ? this.onNextCreate() : this.onNextBind(); - } + }; private onNextCreate(): Observable { const data = this.getServiceData(); @@ -284,7 +284,7 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { return { success: false, message: `Failed to create service instance binding: ${req.message}` }; } else { // Refetch env vars for app, since they have been changed by CF - cfEntityCatalog.appEnvVar.api.getMultiple(data.bindAppGuid, data.cfGuid) + cfEntityCatalog.appEnvVar.api.getMultiple(data.bindAppGuid, data.cfGuid); return { success: true, redirect: true }; } }) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts index 6604494482..00a14152d0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.ts @@ -48,7 +48,7 @@ export class CardAppInstancesComponent implements OnInit, OnDestroy { ).pipe( switchMap(([org, space]) => cups.can(CfCurrentUserPermissions.APPLICATION_EDIT, appService.cfGuid, org.metadata.guid, space.metadata.guid) - )) + )); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.html deleted file mode 100644 index f26820ae69..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Recently updated applications - - - -
- There are no applications. -
-
- -
-
-
-
\ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts deleted file mode 100644 index 136fc16ee1..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { filter, first, map, tap } from 'rxjs/operators'; - -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IApp } from '../../../../cf-api.types'; -import { cfEntityCatalog } from '../../../../cf-entity-catalog'; -import { appDataSort, CloudFoundryEndpointService } from '../../../../features/cf/services/cloud-foundry-endpoint.service'; - -const RECENT_ITEMS_COUNT = 10; - -@Component({ - selector: 'app-card-cf-recent-apps', - templateUrl: './card-cf-recent-apps.component.html', - styleUrls: ['./card-cf-recent-apps.component.scss'], -}) -export class CardCfRecentAppsComponent implements OnInit { - - public recentApps$: Observable[]>; - @Input() allApps$: Observable[]>; - @Input() loading$: Observable; - @Output() refresh = new EventEmitter(); - - constructor( - private store: Store, - public cfEndpointService: CloudFoundryEndpointService, - ) { } - - ngOnInit() { - this.recentApps$ = this.allApps$.pipe( - filter(apps => !!apps), - first(), - map(apps => this.restrictApps(apps)), - tap(apps => this.fetchAppStats(apps)) - ); - } - - private fetchAppStats(recentApps: APIResource[]) { - recentApps.forEach(app => { - if (app.entity.state === 'STARTED') { - cfEntityCatalog.appStats.api.getMultiple(app.metadata.guid, this.cfEndpointService.cfGuid); - } - }); - } - - private restrictApps(apps: APIResource[]): APIResource[] { - if (!apps) { - return []; - } - return apps.sort(appDataSort).slice(0, RECENT_ITEMS_COUNT); - } - -} - - diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.html deleted file mode 100644 index 994e79e2d9..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
- - -
{{ app.metadata.updated_at | date:'medium' }}
-
diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss deleted file mode 100644 index ff8d0d2082..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -:host { - border: 1px solid #ccc; - display: flex; - padding: 0 12px; - - &:not(:first-child) { - border-top: 0; - } -} - -.compact-app-card { - align-items: center; - display: flex; - flex-direction: row; - font-size: 14px; - height: 40px; - width: 100%; - &__name { - flex: 1; - padding-left: 12px; - } -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.ts index ab6ed99ffe..cc634ff0af 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.ts @@ -33,7 +33,7 @@ export class CardCfSpaceDetailsComponent implements OnDestroy { goToOrgQuota() { this.quotaLinkSub = this.cfSpaceService.quotaLink$.subscribe(quotaLink => { this.store.dispatch(new RouterNav({ path: quotaLink })); - this.snackBarService.showReturn('You were switched to an organization', this.router.url, 'Return to space'); + this.snackBarService.showWithLink('You were switched to an organization', this.router.url, 'Return to space'); }); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts index de72d19887..a8a026eef7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts @@ -31,7 +31,7 @@ export class ServiceBrokerCardComponent implements OnDestroy { filter(o => !!o), // Broker is space scoped switchMap(spaceGuid => { - return cfEntityCatalog.space.store.getEntityService(spaceGuid, this.servicesService.cfGuid).waitForEntity$ + return cfEntityCatalog.space.store.getEntityService(spaceGuid, this.servicesService.cfGuid).waitForEntity$; }), tap(space => { this.spaceLink = ['/cloud-foundry', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/create-application/create-application-step1/create-application-step1.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/create-application/create-application-step1/create-application-step1.component.ts index 1e3dd731a4..1552c10c08 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/create-application/create-application-step1/create-application-step1.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/create-application/create-application-step1/create-application-step1.component.ts @@ -49,7 +49,7 @@ export class CreateApplicationStep1Component implements OnInit, AfterContentInit space: this.cfOrgSpaceService.space.select.getValue() })); return of({ success: true }); - } + }; ngOnInit() { if (this.route.root.snapshot.queryParams.endpointGuid) { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts index a06230eeb0..4358af82cc 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.ts @@ -235,7 +235,7 @@ export class CfAppInstancesConfigService implements IListConfig switchMap(([org, space]) => cups.can(CfCurrentUserPermissions.APPLICATION_EDIT, appService.cfGuid, org.metadata.guid, space.metadata.guid) ) - ) + ); } getGlobalActions = () => null; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts index 3976e36dc2..1c25e63be7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts @@ -22,7 +22,7 @@ export class CfAppInstancesDataSource extends ListDataSource ) { const paginationKey = createEntityRelationPaginationKey(applicationEntityType, appGuid); - const action = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid) + const action = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid); super( { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component.ts index 651c1b90ac..bea4bf0411 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component.ts @@ -21,9 +21,10 @@ export class TableCellCfCellComponent extends TableCellCustom i @Input('config') set config(config: { - metricEntityService: EntityService>> - cfGuid: string + metricEntityService: EntityService>>; + cfGuid: string; }) { + super.config = config; if (!config) { return; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts index a113574270..5cb71abcc6 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts @@ -37,7 +37,7 @@ export class CfAppMapRoutesListConfigService extends CfAppRoutesListConfigServic spaceGuid, appService.cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid) - ) + ); // If parentEntitySchema is set the entity validation process will look for the space routes in the parent space entity // In this case, we do have them however they're missing the route-->app relationship.. which means we fetch them at a rate of one per // route. For spaces with hundreds of routes this isn't acceptable, so remove the link to the parent and fetch the list afresh. diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts index 2a658beb99..891e780638 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts @@ -64,7 +64,7 @@ export abstract class CfAppRoutesListConfigServiceBase extends CfRoutesListConfi this.getDataSource = () => { // Lazy init so that any changes to the columns & data functions (like sort) are correctly applied if (!this.dataSource) { - const getAppRoutesAction = cfEntityCatalog.route.actions.getAllForApplication(appService.appGuid, appService.cfGuid) + const getAppRoutesAction = cfEntityCatalog.route.actions.getAllForApplication(appService.appGuid, appService.cfGuid); this.dataSource = new CfAppRoutesDataSource( store, appService, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component.ts index 886357b248..21ee25d4a0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component.ts @@ -5,7 +5,6 @@ import { TableCellCustom } from '../../../../../../../../core/src/shared/compone import { EnvVarViewComponent } from '../../../../env-var-view/env-var-view.component'; import { ListAppEnvVar } from '../cf-app-variables-data-source'; -/* tslint:disable:no-access-missing-member https://github.com/mgechev/codelyzer/issues/191*/ @Component({ selector: 'app-table-cell-edit-variable', templateUrl: './table-cell-edit-variable.component.html', @@ -31,6 +30,6 @@ export class TableCellEditVariableComponent extends TableCellCustom> implements OnInit { - @Input() row: APIResource; applicationState$: Observable; appStatus$: Observable; entityConfig: ComponentEntityMonitorConfig; cfOrgSpace: CfOrgSpaceLabelService; - public favorite: UserFavorite; + public favorite: UserFavorite; constructor( private store: Store, private appStateService: ApplicationStateService, - private favoritesConfigMapper: FavoritesConfigMapper, - - + private userFavoriteManager: UserFavoriteManager ) { super(); } @@ -54,7 +49,7 @@ export class CardAppComponent extends CardCell> implements OnI this.row.entity.space_guid ); - this.favorite = getFavoriteFromEntity(this.row, applicationEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE); + this.favorite = this.userFavoriteManager.getFavorite(this.row, applicationEntityType, CF_ENDPOINT_TYPE); const initState = this.appStateService.get(this.row.entity, null); this.applicationState$ = ApplicationService.getApplicationState( diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-app-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-app-config.service.ts index a2b5398834..81e7adea09 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-app-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-app-config.service.ts @@ -48,13 +48,14 @@ export class CfAppConfigService extends ListConfig implements IList // Apply the initial cf guid to the data source. Normally this is done via applying the selection to the filter... however this is too // late for maxedResult world - this.initialised$ = this.cfOrgSpaceService.cf.loading$.pipe( + this.initialised$ = this.cfOrgSpaceService.isLoading$.pipe( filter(isLoading => !isLoading), switchMap(() => this.cfOrgSpaceService.cf.list$), first(), map(cfs => { const cfGuid = cfs.length === 1 ? cfs[0].guid : null; this.appsDataSource = new CfAppsDataSource(this.store, this, undefined, undefined, undefined, cfGuid); + this.cfOrgSpaceService.setInitialValuesFromAction(this.appsDataSource.action, 'cf', 'org', 'space'); return true; }) ); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component.spec.ts index 064ed53be4..5ce454b9ee 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component.spec.ts @@ -12,13 +12,16 @@ import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; +import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { IApp } from '../../../../../../cf-api.types'; import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from '../table-cell-app-status/table-cell-app-status.component'; +import { TableCellAppCfOrgSpaceHeaderComponent } from './table-cell-app-cforgspace-header.component'; -describe('TableCellAppStatusComponent', () => { - let component: TableCellAppStatusComponent; - let fixture: ComponentFixture>; +describe('TableCellAppCfOrgSpaceHeaderComponent', () => { + let component: TableCellAppCfOrgSpaceHeaderComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -42,9 +45,9 @@ describe('TableCellAppStatusComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(TableCellAppStatusComponent); + fixture = TestBed.createComponent(TableCellAppCfOrgSpaceHeaderComponent); component = fixture.componentInstance; - component.row = { entity: {}, metadata: {} }; + component.row = { entity: {}, metadata: {} } as APIResource; fixture.detectChanges(); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.spec.ts index 064ed53be4..c36063be34 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.spec.ts @@ -12,13 +12,16 @@ import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; +import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { IApp } from '../../../../../../cf-api.types'; import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from '../table-cell-app-status/table-cell-app-status.component'; +import { TableCellAppCfOrgSpaceComponent } from './table-cell-app-cforgspace.component'; -describe('TableCellAppStatusComponent', () => { - let component: TableCellAppStatusComponent; - let fixture: ComponentFixture>; +describe('TableCellAppCfOrgSpaceComponent', () => { + let component: TableCellAppCfOrgSpaceComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -42,9 +45,18 @@ describe('TableCellAppStatusComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(TableCellAppStatusComponent); + fixture = TestBed.createComponent(TableCellAppCfOrgSpaceComponent); component = fixture.componentInstance; - component.row = { entity: {}, metadata: {} }; + component.row = { + entity: { + space: { + entity: { + + } + } + }, + metadata: {} + } as APIResource; fixture.detectChanges(); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.ts index f5c2fdb4c9..f8a2013f6e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component.ts @@ -15,6 +15,7 @@ export class TableCellAppCfOrgSpaceComponent extends TableCellAppCfOrgSpaceBase @Input('row') set row(row: APIResource) { + super.row = row; if (row) { this.init(row.entity.cfGuid, (row.entity.space as APIResource).entity.organization_guid, row.entity.space_guid); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.spec.ts index 73d730dac9..f8cb5f8454 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.spec.ts @@ -12,13 +12,15 @@ import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; +import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { IApp } from '../../../../../../cf-api.types'; import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from './table-cell-app-status.component'; describe('TableCellAppStatusComponent', () => { - let component: TableCellAppStatusComponent; - let fixture: ComponentFixture>; + let component: TableCellAppStatusComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ @@ -44,7 +46,7 @@ describe('TableCellAppStatusComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(TableCellAppStatusComponent); component = fixture.componentInstance; - component.row = { entity: {}, metadata: {} }; + component.row = { entity: {}, metadata: {} } as APIResource; fixture.detectChanges(); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts index 06dd674a12..b38d0a6198 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts @@ -1,10 +1,10 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { startWith } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; +import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IApp } from '../../../../../../cf-api.types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; import { ApplicationStateData, ApplicationStateService } from '../../../../../services/application-state.service'; @@ -13,12 +13,12 @@ import { ApplicationStateData, ApplicationStateService } from '../../../../../se templateUrl: './table-cell-app-status.component.html', styleUrls: ['./table-cell-app-status.component.scss'], }) -export class TableCellAppStatusComponent extends TableCellCustom implements OnInit { +export class TableCellAppStatusComponent extends TableCellCustom> implements OnInit { - @Input() row; applicationState: ApplicationStateData; @Input('config') - set config(value: { hideIcon: boolean, initialStateOnly: boolean }) { + set config(value: { hideIcon: boolean, initialStateOnly: boolean, }) { + super.config = value; value = value || { hideIcon: false, initialStateOnly: false @@ -28,14 +28,9 @@ export class TableCellAppStatusComponent extends TableCellCustom implement } public fetchAppState$: Observable; public hideIcon = false; - public initialStateOnly = false - ; - constructor( - private store: Store, - private appStateService: ApplicationStateService, + public initialStateOnly = false; - - ) { + constructor(private appStateService: ApplicationStateService) { super(); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts index fbc40398d9..6f433e3ab6 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts @@ -18,7 +18,7 @@ import { cfEntityFactory } from '../../../../../cf-entity-factory'; export class CfBuildpacksDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointEntityType, cfGuid); - const action = cfEntityCatalog.buildPack.actions.getMultiple(cfGuid, paginationKey) + const action = cfEntityCatalog.buildPack.actions.getMultiple(cfGuid, paginationKey); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component.ts index dc6211b746..d1f796b8f1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component.ts @@ -13,6 +13,7 @@ export class TableCellConfirmOrgSpaceComponent extends TableCellCustom[]; @Input('row') set row(row: CfRoleChangeWithNames) { + super.row = row; const chipConfig = new AppChip(); chipConfig.key = row; chipConfig.value = row.spaceGuid ? `Space: ${row.spaceName}` : `Org: ${row.orgName}`; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-config.service.ts index 0911a517aa..e88414a714 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-config.service.ts @@ -99,15 +99,15 @@ export class CfEventsConfigService extends ListConfig implements IL }); } - setEventFilters(values: { actee: string, type: string[] }) { + setEventFilters(values: { actee: string, type: string[], }) { this.getEventFilters().pipe( first() ).subscribe(currentFilters => { const action = this.eventSource.action as PaginatedAction; // Recreate the whole q param and set it again using 'AddParams' - const typeChanged = !arraysEqual(values.type, currentFilters.type) - const acteeChanged = valueOrCommonFalsy(values.actee) !== valueOrCommonFalsy(currentFilters.actee) + const typeChanged = !arraysEqual(values.type, currentFilters.type); + const acteeChanged = valueOrCommonFalsy(values.actee) !== valueOrCommonFalsy(currentFilters.actee); if (typeChanged || acteeChanged) { const newQ: string[] = []; if (values.type && values.type.length) { @@ -123,7 +123,7 @@ export class CfEventsConfigService extends ListConfig implements IL getEventFilters(): Observable<{ type: string[], - actee: string + actee: string, }> { return this.getDataSource().pagination$.pipe( distinctUntilChanged(), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.ts index ebbd8333b3..10565d54cf 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.ts @@ -1,20 +1,24 @@ -import { Component, Input } from '@angular/core'; +import { Component } from '@angular/core'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +interface CellEVentActeeConfig { + setActeeFilter: (actee: string) => void; +} + @Component({ selector: 'app-table-cell-event-actee', templateUrl: './table-cell-event-actee.component.html', styleUrls: ['./table-cell-event-actee.component.scss'] }) -export class TableCellEventActeeComponent extends TableCellCustom { +export class TableCellEventActeeComponent extends TableCellCustom { icon: { [type: string]: { icon: string, - iconFont?: string - } + iconFont?: string; + }; } = { '': { icon: 'help' @@ -71,15 +75,6 @@ export class TableCellEventActeeComponent extends TableCellCustom { }, }; - @Input() config: { - setActeeFilter: (actee: string) => void; - }; - - // constructor() { } - - // ngOnInit() { - // } - setActee() { this.config.setActeeFilter(this.row.entity.actee); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component.ts index 62e7f37807..5c7857bcf5 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component.ts @@ -1,5 +1,5 @@ -/* tslint:disable:no-access-missing-member https://github.com/mgechev/codelyzer/issues/191*/ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; + import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component.ts index b65532d6ec..227648ffc1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component.ts @@ -1,5 +1,5 @@ -/* tslint:disable:no-access-missing-member https://github.com/mgechev/codelyzer/issues/191*/ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; + import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component.ts index 324c695ac2..ff19cef07d 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component.ts @@ -15,6 +15,7 @@ export class TableCellFeatureFlagDescriptionComponent extends TableCellCustom { - @Input() row: IFeatureFlag; -} +export class TableCellFeatureFlagStateComponent extends TableCellCustom { } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.ts index fee067f62f..19ac98c5c1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.ts @@ -13,7 +13,6 @@ import { ConfirmationDialogConfig } from '../../../../../../../../core/src/share import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; -import { FavoritesConfigMapper } from '../../../../../../../../store/src/favorite-config-mapper'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; @@ -21,7 +20,7 @@ import { EndpointUser } from '../../../../../../../../store/src/types/endpoint.t import { MenuItem } from '../../../../../../../../store/src/types/menu-item.types'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../../../../store/src/types/shared.types'; import { IFavoriteMetadata, UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; -import { getFavoriteFromEntity } from '../../../../../../../../store/src/user-favorite-helpers'; +import { UserFavoriteManager } from '../../../../../../../../store/src/user-favorite-manager'; import { IApp, IOrganization } from '../../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { getStartedAppInstanceCount } from '../../../../../../cf.helpers'; @@ -64,7 +63,7 @@ export class CfOrgCardComponent extends CardCell> imp private confirmDialog: ConfirmationDialogService, private paginationMonitorFactory: PaginationMonitorFactory, private emf: EntityMonitorFactory, - private favoritesConfigMapper: FavoritesConfigMapper + private userFavoriteManager: UserFavoriteManager ) { super(); @@ -96,7 +95,7 @@ export class CfOrgCardComponent extends CardCell> imp refCount() ); - this.favorite = getFavoriteFromEntity(this.row, organizationEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE); + this.favorite = this.userFavoriteManager.getFavorite(this.row, organizationEntityType, CF_ENDPOINT_TYPE); const allApps$: Observable[]> = this.cfEndpointService.appsPagObs.hasEntities$.pipe( switchMap(hasAll => hasAll ? this.cfEndpointService.getAppsInOrgViaAllApps(this.row) : observableOf(null)) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-data-source.service.ts deleted file mode 100644 index 86c11ed8c3..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-data-source.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Store } from '@ngrx/store'; -import { getRowMetadata } from '@stratosui/store'; - -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { - ListDataSource, -} from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; -import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CloudFoundryEndpointService } from '../../../../../features/cf/services/cloud-foundry-endpoint.service'; - -export class CfOrgsDataSourceService extends ListDataSource { - - constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { - const action = CloudFoundryEndpointService.createGetAllOrganizations(cfGuid); - super({ - store, - action, - schema: cfEntityFactory(organizationEntityType), - getRowUniqueId: getRowMetadata, - paginationKey: action.paginationKey, - isLocal: true, - transformEntities: [{ type: 'filter', field: 'entity.name' }], - listConfig - }); - } -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.spec.ts deleted file mode 100644 index 748f7e2c7f..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { inject, TestBed } from '@angular/core/testing'; - -import { - generateCfBaseTestModules, - generateTestCfEndpointServiceProvider, -} from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfOrgsListConfigService } from './cf-orgs-list-config.service'; - -describe('CfOrgsListConfigService', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [...generateTestCfEndpointServiceProvider(), CfOrgsListConfigService], - imports: generateCfBaseTestModules() - - }); - }); - - it('should be created', inject([CfOrgsListConfigService], (service: CfOrgsListConfigService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.ts deleted file mode 100644 index 3986f60290..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; - -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; -import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { IOrganization } from '../../../../../cf-api.types'; -import { ActiveRouteCfOrgSpace } from '../../../../../features/cf/cf-page.types'; -import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; -import { CfOrgCardComponent } from './cf-org-card/cf-org-card.component'; -import { CfOrgsDataSourceService } from './cf-orgs-data-source.service'; - -@Injectable() -export class CfOrgsListConfigService extends BaseCfListConfig> { - dataSource: CfOrgsDataSourceService; - cardComponent = CfOrgCardComponent; - enableTextFilter = true; - text = { - title: null, - filter: 'Search by name', - noEntries: 'There are no organizations' - }; - columns: ITableColumn>[] = [{ - columnId: 'name', - headerCell: () => 'Name', - sort: { - type: 'sort', - orderKey: 'name', - field: 'entity.name' - } - }, { - columnId: 'createdAt', - headerCell: () => 'Creation', - sort: { - type: 'sort', - orderKey: 'createdAt', - field: 'metadata.created_at' - }, - }]; - - constructor(private store: Store, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace) { - super(); - this.dataSource = new CfOrgsDataSourceService(this.store, activeRouteCfOrgSpace.cfGuid, this); - } - - getColumns = () => this.columns; - getGlobalActions = () => []; - getMultiActions = () => []; - getSingleActions = () => []; - getMultiFiltersConfigs = () => []; - getDataSource = () => this.dataSource; -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts index 83a47399bc..04f244b4c2 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts @@ -12,7 +12,7 @@ import { IQuotaDefinition } from '../../../../../../cf-api.types'; export class TableCellQuotaComponent extends TableCellCustom> implements OnInit { quotaUrl: string[]; - constructor() { + constructor() { super(); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config.service.ts index f800809ecf..1b640b3a54 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config.service.ts @@ -16,11 +16,7 @@ import { import { APIResource } from '../../../../../../../store/src/types/api.types'; import { CloudFoundryEndpointService } from '../../../../../features/cf/services/cloud-foundry-endpoint.service'; import { CfCurrentUserPermissions } from '../../../../../user-permissions/cf-user-permissions-checkers'; -import { - CfOrgSpaceDataService, - createCfOrgSpaceFilterConfig, - initCfOrgSpaceService, -} from '../../../../data-services/cf-org-space-service.service'; +import { CfOrgSpaceDataService, createCfOrgSpaceFilterConfig } from '../../../../data-services/cf-org-space-service.service'; import { CfRoutesDataSource } from './cf-routes-data-source'; import { ListCfRoute } from './cf-routes-data-source-base'; import { CfRoutesListConfigBase } from './cf-routes-list-config-base'; @@ -76,10 +72,6 @@ export class CfRoutesListConfigService extends CfRoutesListConfigBase implements createCfOrgSpaceFilterConfig('org', 'Organization', cfOrgSpaceService.org), ]; this.getMultiFiltersConfigs = () => multiFilterConfigs; - initCfOrgSpaceService(store, cfOrgSpaceService, - this.dataSource.masterAction.entityType, - this.dataSource.masterAction.paginationKey).subscribe(); - cfOrgSpaceService.cf.select.next(cfService.cfGuid); this.getInitialised = () => combineLatest( cfOrgSpaceService.cf.list$, @@ -89,5 +81,7 @@ export class CfRoutesListConfigService extends CfRoutesListConfigBase implements map(loading => !loading), startWith(true) ); + + cfOrgSpaceService.cf.select.next(cfService.cfGuid); } } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component.ts index 0388207852..b0e1fe4cf4 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component.ts @@ -19,18 +19,16 @@ export class TableCellRouteAppsAttachedComponent extends TableCellCustom im @Input('config') set config(config: any) { + super.config = config; this.config$.next(config); } @Input('row') set row(route: APIResource) { + super.row = route; this.row$.next(route); } - constructor() { - super(); - } - ngOnInit(): void { this.boundApps$ = combineLatest([ this.config$.asObservable().pipe(first()), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts index cf73ba00b7..b8489e9fe1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts @@ -32,15 +32,16 @@ export class CfServiceCardComponent extends CardCell> { tags: AppChip[] = []; brokerNameConfig: TableCellServiceBrokerComponentConfig = { mode: TableCellServiceBrokerComponentMode.NAME - } + }; brokerScopeConfig: TableCellServiceBrokerComponentConfig = { mode: TableCellServiceBrokerComponentMode.SCOPE - } + }; @Input() disableCardClick = false; @Input('row') set row(row: APIResource) { + super.row = row; if (row) { this.serviceEntity = row; this.extraInfo = null; @@ -69,5 +70,5 @@ export class CfServiceCardComponent extends CardCell> { goToServiceInstances = () => this.store.dispatch(new RouterNav({ path: ['marketplace', this.serviceEntity.entity.cfGuid, this.serviceEntity.metadata.guid] - })) + })); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component.ts index 0cb53ef299..18326c7080 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component } from '@angular/core'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; @@ -9,12 +9,4 @@ import { IService } from '../../../../../../cf-api-svc.types'; templateUrl: './table-cell-service-active.component.html', styleUrls: ['./table-cell-service-active.component.scss'] }) -export class TableCellServiceActiveComponent extends TableCellCustom> { - - @Input() row: APIResource; - - constructor() { - super(); - } - -} +export class TableCellServiceActiveComponent extends TableCellCustom> { } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component.ts index fb4815f3fc..03e66d952e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component } from '@angular/core'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; @@ -9,11 +9,4 @@ import { IService } from '../../../../../../cf-api-svc.types'; templateUrl: './table-cell-service-bindable.component.html', styleUrls: ['./table-cell-service-bindable.component.scss'] }) -export class TableCellServiceBindableComponent extends TableCellCustom> { - - @Input() row: APIResource; - - constructor() { - super(); - } -} +export class TableCellServiceBindableComponent extends TableCellCustom> { } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-broker/table-cell-service-broker.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-broker/table-cell-service-broker.component.ts index 1f61b851d9..dd4c33b7d3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-broker/table-cell-service-broker.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-broker/table-cell-service-broker.component.ts @@ -23,15 +23,13 @@ export interface TableCellServiceBrokerComponentConfig { templateUrl: './table-cell-service-broker.component.html', styleUrls: ['./table-cell-service-broker.component.scss'] }) -export class TableCellServiceBrokerComponent extends TableCellCustom> { +export class TableCellServiceBrokerComponent extends + TableCellCustom, + TableCellServiceBrokerComponentConfig> { - @Input() - config: TableCellServiceBrokerComponentConfig; - - pRow: APIResource; @Input() set row(row: APIResource) { - this.pRow = row; + super.row = row; if (row && !this.spaceLink$) { this.broker$ = cfEntityCatalog.serviceBroker.store.getEntityService( this.row.entity.service_broker_guid, @@ -64,7 +62,7 @@ export class TableCellServiceBrokerComponent extends TableCellCustom { - return this.pRow; + return super.row; } public spaceLink$: Observable<{ @@ -73,8 +71,4 @@ export class TableCellServiceBrokerComponent extends TableCellCustom; public broker$: Observable>; - constructor() { - super(); - } - } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component.ts index ec34e51905..382adf2209 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component.ts @@ -18,6 +18,7 @@ export class TableCellServiceCfBreadcrumbsComponent extends TableCellCustom) { + super.row = pService; if (!pService || !!this.cfOrgSpace) { return; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component.ts index 2e7687d1d5..1bac38c746 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component.ts @@ -15,6 +15,7 @@ export class TableCellServiceProviderComponent extends TableCellCustom) { + super.row = pService; if (!!pService && !!pService.entity.extra && !this.extraInfo) { try { this.extraInfo = JSON.parse(pService.entity.extra); @@ -22,8 +23,4 @@ export class TableCellServiceProviderComponent extends TableCellCustom) { + super.row = pService; if (!!pService && !!pService.entity.extra && !this.extraInfo) { try { this.extraInfo = JSON.parse(pService.entity.extra); @@ -23,10 +24,6 @@ export class TableCellServiceReferencesComponent extends TableCellCustom[] = []; - private service; @Input() set row(pService: APIResource) { - this.service = pService; + super.row = pService; if (!pService) { return; } @@ -29,10 +28,7 @@ export class TableCellServiceTagsComponent extends TableCellCustom { - return this.service; + return super.row; } - constructor() { - super(); - } } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts index 553a0b3299..6e4dfc1a7c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts @@ -32,10 +32,10 @@ export class CfSpaceRoutesDataSource extends CfRoutesDataSourceBase implements I const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); const action = cfEntityCatalog.route.actions.getAllInSpace( spaceGuid, cfGuid, paginationKey, [ - createEntityRelationKey(routeEntityType, applicationEntityType), - createEntityRelationKey(routeEntityType, domainEntityType), - ], true, false - ) + createEntityRelationKey(routeEntityType, applicationEntityType), + createEntityRelationKey(routeEntityType, domainEntityType), + ], true, false + ); action.initialParams['order-direction-field'] = 'creation'; super(store, listConfig, cfGuid, action, false); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts index be4145b2a2..537c4df65e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts @@ -19,7 +19,9 @@ import { getCfServiceInstance } from '../../../../../../features/service-catalog templateUrl: './table-cell-service-instance-apps-attached.component.html', styleUrls: ['./table-cell-service-instance-apps-attached.component.scss'] }) -export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCustom> implements OnInit { +export class TableCellServiceInstanceAppsAttachedComponent + extends TableCellCustom> + implements OnInit { boundApps$: Observable; config$ = new BehaviorSubject(null); @@ -27,11 +29,13 @@ export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCust @Input('config') set config(config: any) { + super.config = config; this.config$.next(config); } @Input('row') set row(row: APIResource) { + super.row = row; this.row$.next(row); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component.ts index fe237bc1a9..0d2b945471 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component.ts @@ -21,6 +21,7 @@ export class TableCellServiceInstanceTagsComponent tags: AppChip[] = []; @Input('row') set row(row) { + super.row = row; if (row) { this.tags.length = 0; if (row.entity && row.entity.service_instance && row.entity.service_instance.entity.tags) { @@ -42,9 +43,4 @@ export class TableCellServiceInstanceTagsComponent } } } - - constructor() { - super(); - } - } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.ts index 5d545f0a67..ab03e93155 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; @@ -12,15 +12,9 @@ import { userProvidedServiceInstanceEntityType } from '../../../../../../cf-enti }) export class TableCellServiceLastOpComponent extends TableCellCustom> implements OnInit { - @Input() row; - @Input() entityKey: string; // tslint:disable-next-line:ban-types isUserProvidedServiceInstance: Boolean; - constructor() { - super(); - } - ngOnInit() { this.isUserProvidedServiceInstance = this.entityKey === userProvidedServiceInstanceEntityType; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts index b9cbab0fec..846403b929 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Observable, of } from 'rxjs'; import { filter, map } from 'rxjs/operators'; @@ -28,17 +28,13 @@ export class TableCellServiceComponent extends TableCellCustom; - @Input() entityKey: string; - brokerNameConfig: TableCellServiceBrokerComponentConfig = { mode: TableCellServiceBrokerComponentMode.NAME - } + }; brokerScopeConfig: TableCellServiceBrokerComponentConfig = { mode: TableCellServiceBrokerComponentMode.SCOPE, altScope: true - } - + }; ngOnInit() { this.isUserProvidedServiceInstance = diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component.ts index 9c4debc316..a48db6dc86 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; @@ -15,10 +15,7 @@ export class TableCellSpaceNameComponent extends TableCellCustom; - @Input() row; - constructor() { - super(); - } + ngOnInit(): void { this.spaceUrl = [ '/cloud-foundry', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.ts index 784692eab6..6fdff2967e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.ts @@ -14,7 +14,6 @@ import { ConfirmationDialogConfig } from '../../../../../../../../core/src/share import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; -import { FavoritesConfigMapper } from '../../../../../../../../store/src/favorite-config-mapper'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; @@ -22,7 +21,7 @@ import { EndpointUser } from '../../../../../../../../store/src/types/endpoint.t import { MenuItem } from '../../../../../../../../store/src/types/menu-item.types'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../../../../store/src/types/shared.types'; import { UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; -import { getFavoriteFromEntity } from '../../../../../../../../store/src/user-favorite-helpers'; +import { UserFavoriteManager } from '../../../../../../../../store/src/user-favorite-manager'; import { IApp, ISpace } from '../../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; @@ -68,7 +67,7 @@ export class CfSpaceCardComponent extends CardCell> implemen private confirmDialog: ConfirmationDialogService, private paginationMonitorFactory: PaginationMonitorFactory, private emf: EntityMonitorFactory, - private favoritesConfigMapper: FavoritesConfigMapper + private userFavoriteManager: UserFavoriteManager ) { super(); } @@ -77,7 +76,7 @@ export class CfSpaceCardComponent extends CardCell> implemen this.spaceGuid = this.row.metadata.guid; this.entityConfig = new ComponentEntityMonitorConfig(this.spaceGuid, cfEntityFactory(spaceEntityType)); this.orgGuid = this.cfOrgService.orgGuid; - this.favorite = getFavoriteFromEntity(this.row, spaceEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE); + this.favorite = this.userFavoriteManager.getFavorite(this.row, spaceEntityType, CF_ENDPOINT_TYPE); this.cardMenu = [ { label: 'Edit', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.spec.ts index 5b4324b95c..0ef6847eb7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.spec.ts @@ -4,18 +4,26 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfOrgsListConfigService } from '../cf-orgs/cf-orgs-list-config.service'; +import { + CloudFoundryOrganizationServiceMock, +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; +import { CloudFoundryOrganizationService } from '../../../../../features/cf/services/cloud-foundry-organization.service'; +import { CfSpacesListConfigService } from './cf-spaces-list-config.service'; describe('CfOrgsSpaceListConfigService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [...generateTestCfEndpointServiceProvider(), CfOrgsListConfigService], + providers: [ + ...generateTestCfEndpointServiceProvider(), + CfSpacesListConfigService, + { provide: CloudFoundryOrganizationService, useClass: CloudFoundryOrganizationServiceMock }, + ], imports: generateCfBaseTestModules() }); }); - it('should be created', inject([CfOrgsListConfigService], (service: CfOrgsListConfigService) => { + it('should be created', inject([CfSpacesListConfigService], (service: CfSpacesListConfigService) => { expect(service).toBeTruthy(); })); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component.ts index 1af855c8b6..9c45512773 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component.ts @@ -31,7 +31,9 @@ export class TableCellSelectOrgComponent extends TableCellCustom, private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private cfRolesService: CfRolesService, - ) { super(); } + ) { + super(); + } ngOnInit() { if (this.activeRouteCfOrgSpace.orgGuid) { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts index 4f79ca2521..5e58087316 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-permission-cell.ts @@ -33,6 +33,7 @@ export abstract class CfPermissionCellDirective extends TableCellCustom) { + super.row = row; this.rowSubject.next(row); this.guid = row.metadata.guid; this.userEntity.next(row.entity); @@ -40,6 +41,7 @@ export abstract class CfPermissionCellDirective extends TableCellCustom !!org), first(), map((orgs: APIResource[]) => { - const orgNames: { [orgGuid: string]: string; } = {}; + const orgNames: { [orgGuid: string]: string, } = {}; orgs.forEach(org => { orgNames[org.metadata.guid] = org.entity.name; }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts index 3315917aa2..d3898d71b6 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts @@ -1,67 +1,73 @@ import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; +import { + GitCommit, + gitEntityCatalog, + GithubCommitsDataSource, + GithubCommitsListConfigServiceBase, + GitMeta, + GitSCM, + GitSCMService, + GitSCMType, +} from '@stratosui/git'; import moment from 'moment'; import { Observable } from 'rxjs'; import { combineLatest, filter, first, map } from 'rxjs/operators'; +import { IListAction } from '../../../../../../../core/src/shared/components/list/list.component.types'; +import { getCommitGuid } from '../../../../../../../git/src/store/git-entity-factory'; +import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { CheckProjectExists, SetAppSourceDetails, SetDeployBranch, SetDeployCommit, StoreCFSettings, -} from '../../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { cfEntityCatalog } from '../../../../../../../cloud-foundry/src/cf-entity-catalog'; -import { gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; -import { selectCfEntity } from '../../../../../../../cloud-foundry/src/store/selectors/api.selectors'; -import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; -import { IListAction } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; -import { GitSCM } from '../../../../data-services/scm/scm'; -import { GitSCMService, GitSCMType } from '../../../../data-services/scm/scm.service'; -import { GithubCommitsDataSource } from './github-commits-data-source'; -import { GithubCommitsListConfigServiceBase } from './github-commits-list-config-base.service'; - +} from '../../../../../actions/deploy-applications.actions'; +import { CFAppState } from '../../../../../cf-app-state'; +import { ApplicationService } from '../../../../../features/applications/application.service'; @Injectable() export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfigServiceBase { + constructor( + store: Store, + datePipe: DatePipe, + private scmService: GitSCMService, + private applicationService: ApplicationService, + ) { + super(store, datePipe); + this.setGuids(); + this.setGithubDetails(); + } + private listActionRedeploy: IListAction = { action: (commitEntity) => { // set CF data - this.store.dispatch( - new StoreCFSettings({ - cloudFoundry: this.cfGuid, - org: this.orgGuid, - space: this.spaceGuid - }) - ); + this.store.dispatch(new StoreCFSettings({ + cloudFoundry: this.cfGuid, + org: this.orgGuid, + space: this.spaceGuid + })); // Set Project data - this.store.dispatch( - new CheckProjectExists(this.scm, this.projectName) - ); + this.store.dispatch(new CheckProjectExists(this.scm, this.projectName)); // Set Source type - this.store.dispatch( - new SetAppSourceDetails({ - name: this.scm.getLabel(), - id: this.scm.getType(), - group: 'gitscm' - }) - ); + this.store.dispatch(new SetAppSourceDetails({ + name: this.scm.getLabel(), + id: this.scm.getType(), + group: 'gitscm', + endpointGuid: this.scm.endpointGuid, + })); // Set branch this.store.dispatch(new SetDeployBranch(this.branchName)); // Set Commit this.store.dispatch(new SetDeployCommit(commitEntity.sha)); - this.store.dispatch( - new RouterNav({ - path: ['/applications/deploy'], - query: { appGuid: this.appGuid } - }) - ); + this.store.dispatch(new RouterNav({ + path: ['/applications/deploy'], + query: { appGuid: this.appGuid } + })); }, label: 'Deploy', description: ``, @@ -69,7 +75,7 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi private listActionCompare: IListAction = { action: (compareToCommit) => { - window.open(this.getCompareURL(compareToCommit.sha), '_blank'); + this.getCompareURL(compareToCommit.sha).pipe(first()).subscribe(url => window.open(url, '_blank')); }, label: 'Compare', description: '', @@ -95,17 +101,7 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi private deployedCommit: GitCommit; private deployedTime: number; private scm: GitSCM; - - constructor( - store: Store, - datePipe: DatePipe, - private scmService: GitSCMService, - private applicationService: ApplicationService, - ) { - super(store, datePipe); - this.setGuids(); - this.setGithubDetails(); - } + private scmMeta: GitMeta; private setGuids() { this.applicationService.waitForAppEntity$.pipe( @@ -126,13 +122,14 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi this.projectName = stratosProject.deploySource.project; this.deployedCommitSha = stratosProject.deploySource.commit; const scmType = stratosProject.deploySource.scm || stratosProject.deploySource.type; - this.scm = this.scmService.getSCM(scmType as GitSCMType); - - cfEntityCatalog.gitBranch.store.getEntityService(undefined, undefined, { + this.scm = this.scmService.getSCM(scmType as GitSCMType, stratosProject.deploySource.endpointGuid); + this.scmMeta = { scm: this.scm, projectName: this.projectName, branchName: stratosProject.deploySource.branch - }) + }; + + gitEntityCatalog.branch.store.getEntityService(undefined, undefined, this.scmMeta) .waitForEntity$.pipe( first(), ).subscribe(branch => { @@ -146,21 +143,22 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi }); } - private getCompareURL(sha: string): string { - return this.scm.getCompareCommitURL(this.projectName, this.deployedCommitSha, sha); + private getCompareURL(sha: string): Observable { + return gitEntityCatalog.repo.store.getRepoInfo.getEntityService(this.scmMeta).waitForEntity$.pipe( + first(), + map(project => this.scm.getCompareCommitURL(project.entity.html_url, this.deployedCommitSha, sha)) + ); } private setDeployedCommitDetails() { const scmType = this.scm.getType(); - this.store.select( - selectCfEntity(gitCommitEntityType, scmType + '-' + this.projectName + '-' + this.deployedCommitSha)) - .pipe( - filter(deployedCommit => !!deployedCommit), - first(), - ).subscribe(deployedCommit => { - this.deployedCommit = deployedCommit; - this.deployedTime = moment(this.deployedCommit.commit.author.date).unix(); - }); + gitEntityCatalog.commit.store.getEntityMonitor(getCommitGuid(scmType, this.projectName, this.deployedCommitSha)).entity$.pipe( + filter(deployedCommit => !!deployedCommit), + first(), + ).subscribe(deployedCommit => { + this.deployedCommit = deployedCommit; + this.deployedTime = moment(this.deployedCommit.commit.author.date).unix(); + }); } public getSingleActions = () => [this.listActionRedeploy, this.listActionCompare]; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts index 569bcf6b38..11b0179daf 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts @@ -1,6 +1,7 @@ import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; +import { GithubCommitsDataSource, GithubCommitsListConfigServiceBase, GitSCMService, GitSCMType } from '@stratosui/git'; import { filter, first, map } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; @@ -9,9 +10,7 @@ import { DeployApplicationSource } from '../../../../../../../cloud-foundry/src/ import { TableCellRadioComponent, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component'; -import { GitSCMService, GitSCMType } from '../../../../data-services/scm/scm.service'; -import { GithubCommitsDataSource } from './github-commits-data-source'; -import { GithubCommitsListConfigServiceBase } from './github-commits-list-config-base.service'; + @Injectable() export class GithubCommitsListConfigServiceDeploy extends GithubCommitsListConfigServiceBase { @@ -35,13 +34,14 @@ export class GithubCommitsListConfigServiceDeploy extends GithubCommitsListConfi return (appSource.type.id === 'github' || appSource.type.id === 'gitlab') ? { scm: appSource.type.id as GitSCMType, projectName: appSource.gitDetails.projectName, - sha: appSource.gitDetails.branch.name + sha: appSource.gitDetails.branch.name, + endpointGuid: appSource.gitDetails.endpointGuid } : null; }), filter(fetchDetails => !!fetchDetails && !!fetchDetails.projectName && !!fetchDetails.sha), first() ).subscribe(fetchDetails => { - const scm = scmService.getSCM(fetchDetails.scm); + const scm = scmService.getSCM(fetchDetails.scm, fetchDetails.endpointGuid); this.dataSource = new GithubCommitsDataSource(this.store, this, scm, fetchDetails.projectName, fetchDetails.sha); this.initialised.next(true); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component.ts index 9c178e613e..c3d3ff8174 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component.ts @@ -14,10 +14,9 @@ export class TableCellAServicePlanPriceComponent extends TableCellCustom) { - this.pServicePlan = servicePlan; + super.row = servicePlan; if (!servicePlan) { return; } @@ -25,6 +24,6 @@ export class TableCellAServicePlanPriceComponent extends TableCellCustom { - return this.pServicePlan; + return super.row; } } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts index 8f8f8a5592..e2962a50c6 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts @@ -39,7 +39,7 @@ export class ServiceInstanceCardComponent extends CardCell) { - + super.row = row; if (row) { this.serviceInstanceEntity = row; const schema = cfEntityFactory(serviceInstancesEntityType); @@ -104,7 +104,7 @@ export class ServiceInstanceCardComponent extends CardCell { this.serviceActionHelperService.detachServiceBinding( @@ -157,13 +157,13 @@ export class ServiceInstanceCardComponent extends CardCell this.serviceActionHelperService.deleteServiceInstance( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.name, this.serviceInstanceEntity.entity.cfGuid - ) + ); private edit = () => this.serviceActionHelperService.startEditServiceBindingStepper( this.serviceInstanceEntity.metadata.guid, @@ -171,7 +171,7 @@ export class ServiceInstanceCardComponent extends CardCell ({ breadcrumbs: 'services-wall' }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts index 2c76635469..3f327ab0b7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts @@ -91,6 +91,7 @@ export class ServiceInstancesWallListConfigService extends CfServiceInstancesLis breadcrumbs: 'service-wall' }; + this.cfOrgSpaceService.setInitialValuesFromAction(this.dataSource.masterAction, 'cf', 'org', 'space'); this.getInitialised = () => combineLatest( cfOrgSpaceService.cf.list$, cfOrgSpaceService.org.list$, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component.ts index 0103bc36be..c4ce6577a2 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component.ts @@ -38,6 +38,7 @@ export class UserProvidedServiceInstanceCardComponent extends CardCell) { + super.row = row; if (row) { this.setup(row); } @@ -107,14 +108,14 @@ export class UserProvidedServiceInstanceCardComponent extends CardCell this.serviceActionHelperService.deleteServiceInstance( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.name, this.serviceInstanceEntity.entity.cfGuid, true - ) + ); private edit = () => this.serviceActionHelperService.startEditServiceBindingStepper( this.serviceInstanceEntity.metadata.guid, @@ -123,7 +124,7 @@ export class UserProvidedServiceInstanceCardComponent extends CardCell ({ breadcrumbs: 'services-wall' }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.ts index ab7ea7ac55..947468106e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.ts @@ -1,9 +1,9 @@ import { AfterContentInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; +import { JsonPointer } from '@cfstratos/ajsf-core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { delay } from 'rxjs/operators'; -import { JsonPointer } from '@cfstratos/ajsf-core'; import { safeStringToObj } from '../../../../../core/src/core/utils.service'; import { isValidJsonValidator } from '../../../../../core/src/shared/form-validators'; @@ -125,7 +125,7 @@ export class SchemaFormComponent implements OnInit, OnDestroy, AfterContentInit return obj; }, {}); return Object.keys(filterSchema).length > 0 ? filterSchema : null; - } + }; onFormChange(formData) { this.formData = formData; @@ -149,6 +149,6 @@ export class SchemaFormComponent implements OnInit, OnDestroy, AfterContentInit }, ''); return `${a} ${arrMessage} ${c.message}
`; }, ''); - } + }; } diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts index e8ce2c3184..188cb717af 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts @@ -1,6 +1,6 @@ import { Injectable, OnDestroy } from '@angular/core'; import { Store } from '@ngrx/store'; -import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; +import { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, @@ -28,10 +28,9 @@ import { PaginationMonitorFactory } from '../../../../store/src/monitors/paginat import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { getCurrentPageRequestInfo } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { connectedEndpointsOfTypesSelector } from '../../../../store/src/selectors/endpoint.selectors'; -import { selectPaginationState } from '../../../../store/src/selectors/pagination.selectors'; import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; -import { PaginatedAction, PaginationParam } from '../../../../store/src/types/pagination.types'; +import { PaginatedAction, PaginationEntityState, PaginationParam } from '../../../../store/src/types/pagination.types'; import { IOrganization, ISpace } from '../../cf-api.types'; import { cfEntityCatalog } from '../../cf-entity-catalog'; import { cfEntityFactory } from '../../cf-entity-factory'; @@ -63,6 +62,8 @@ export function createCfOrgSpaceFilterConfig(key: string, label: string, cfOrgSp export interface CfOrgSpaceItem { list$: Observable; loading$: Observable; + // A lot of problems are caused by these being BehaviourSubject's (specifically auto select process in CfOrgSpaceDataService and sticky + // values). Ideally this would change to Subject... but some usages .value select: BehaviorSubject; } @@ -77,30 +78,6 @@ export const enum CfOrgSpaceSelectMode { ANY = 2 } - -export const initCfOrgSpaceService = ( - store: Store, - cfOrgSpaceService: CfOrgSpaceDataService, - entityKey: string, - paginationKey: string): Observable => { - return store.select(selectPaginationState(entityKey, paginationKey)).pipe( - filter((pag) => !!pag), - first(), - tap(pag => { - const { cf, org, space } = pag.clientPagination.filter.items; - if (cf) { - cfOrgSpaceService.cf.select.next(cf); - } - if (org) { - cfOrgSpaceService.org.select.next(org); - } - if (space) { - cfOrgSpaceService.space.select.next(space); - } - }) - ); -}; - export const createCfOrSpaceMultipleFilterFn = ( store: Store, action: PaginatedAction, @@ -154,6 +131,7 @@ export const createCfOrSpaceMultipleFilterFn = ( }; }; +interface InitialValues { cf: string; org: string; space: string; } /** * This service relies on OnDestroy, so must be `provided` by a component @@ -168,7 +146,7 @@ export class CfOrgSpaceDataService implements OnDestroy { public space: CfOrgSpaceItem; public isLoading$: Observable; - public paginationAction = this.createPaginationAction(); + public paginationAction = this.createOrgPaginationAction(); /** * This will contain all org and space data @@ -182,6 +160,15 @@ export class CfOrgSpaceDataService implements OnDestroy { private selectMode = CfOrgSpaceSelectMode.FIRST_ONLY; private subs: Subscription[] = []; + /* + * Observable that provides initial values for drop downs, output will be parsed through initialValuesMap before emitted on first + */ + public initialValues$: Observable; + /** + * Map values from `initialValues$` to supply initial values for drop downs + */ + public initialValuesMap: (param: any) => InitialValues; + constructor( private store: Store, public paginationMonitorFactory: PaginationMonitorFactory, @@ -190,15 +177,6 @@ export class CfOrgSpaceDataService implements OnDestroy { this.createOrg(); this.createSpace(); - // Start watching the cf/org/space plus automatically setting values only when we actually have values to auto select - this.org.list$.pipe( - first(), - ).subscribe({ - complete: () => { - this.setupAutoSelectors(); - } - }); - this.isLoading$ = combineLatest( this.cf.loading$, this.org.loading$, @@ -249,7 +227,7 @@ export class CfOrgSpaceDataService implements OnDestroy { loading$: list$.pipe( map(cfs => !cfs) ), - select: new BehaviorSubject(undefined) + select: new BehaviorSubject(null) // Should be different to undefined (sticky values & reset list) }; } @@ -270,7 +248,7 @@ export class CfOrgSpaceDataService implements OnDestroy { this.org = { list$: orgList$, loading$: this.allOrgsLoading$, - select: new BehaviorSubject(undefined) + select: new BehaviorSubject(null) // Should be different to undefined (sticky values & reset list) }; } @@ -297,11 +275,11 @@ export class CfOrgSpaceDataService implements OnDestroy { this.space = { list$: spaceList$, loading$: this.org.loading$, - select: new BehaviorSubject(undefined) + select: new BehaviorSubject(null) // Should be different to undefined (sticky values & reset list) }; } - private createPaginationAction() { + private createOrgPaginationAction() { return cfEntityCatalog.org.actions.getMultiple(null, CfOrgSpaceDataService.CfOrgSpaceServicePaginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), @@ -318,12 +296,57 @@ export class CfOrgSpaceDataService implements OnDestroy { ); } - private setupAutoSelectors() { + public setInitialValuesFromAction( + paginatedAction: PaginatedAction, + cfKey: string, + orgKey: string, + spaceKey: string, + ) { + this.initialValuesMap = (p: PaginationEntityState) => ({ + cf: p.clientPagination?.filter?.items[cfKey], + org: p.clientPagination?.filter?.items[orgKey], + space: p.clientPagination?.filter?.items[spaceKey] + }); + this.initialValues$ = this.paginationMonitorFactory.create( + paginatedAction.paginationKey, + cfEntityFactory(paginatedAction.entityType), + paginatedAction.flattenPagination + ).pagination$.pipe( + filter(p => !!p?.clientPagination?.filter), + ); + } + + private getInitialValues(): Observable { + const initialValues$ = this.initialValues$ || of({ cf: undefined, org: undefined, space: undefined }); + const defaultMap = (a: any) => a; + const initialValuesMap = this.initialValuesMap || defaultMap; + return initialValues$.pipe( + first(), + map(initialValuesMap) // Map needs to happen at the point the auto selectors are enabled + ); + } + + public enableAutoSelectors() { + combineLatest( + // Start watching the cf/org/space plus automatically setting values only when we actually have values to auto select + this.org.list$, + // Get initial values only after we've given a prod... so first values emitted are the one's we want + this.getInitialValues(), + ).pipe(first()).subscribe(([, initialValues]) => { + this.setupAutoSelectors(initialValues.cf, initialValues.org); + }); + } + + private setupAutoSelectors(initialCf: string, initialOrg: string) { + // Clear or automatically select org + space given cf + let cfTapped = false; const orgResetSub = this.cf.select.asObservable().pipe( - startWith(undefined), + startWith(initialCf), distinctUntilChanged(), + filter(cf => cfTapped || cf !== initialCf), withLatestFrom(this.org.list$), tap(([selectedCF, orgs]) => { + cfTapped = true; if ( !!orgs.length && ((this.selectMode === CfOrgSpaceSelectMode.FIRST_ONLY && orgs.length === 1) || @@ -339,11 +362,14 @@ export class CfOrgSpaceDataService implements OnDestroy { this.subs.push(orgResetSub); // Clear or automatically select space given org + let orgTapped = false; const spaceResetSub = this.org.select.asObservable().pipe( - startWith(undefined), + startWith(initialOrg), distinctUntilChanged(), + filter(org => orgTapped || org !== initialOrg), withLatestFrom(this.space.list$), tap(([selectedOrg, spaces]) => { + orgTapped = true; if ( !!spaces.length && ((this.selectMode === CfOrgSpaceSelectMode.FIRST_ONLY && spaces.length === 1) || diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts index 01e167c8e2..7e3bf67940 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts @@ -51,7 +51,7 @@ import { export class CfUserService { private allUsers$: Observable>>; - users: { [guid: string]: Observable> } = {}; + users: { [guid: string]: Observable>; } = {}; constructor( private store: Store, @@ -93,7 +93,7 @@ export class CfUserService { return !!users ? users.filter(p => p.entity.cfGuid === endpointGuid) : null; }), filter(users => filterEmpty ? !!users : true) - ) + ); getUser = (endpointGuid: string, userGuid: string): Observable => { // Attempt to get user from all users first, this better covers the case when a non-admin can't hit /users @@ -117,7 +117,7 @@ export class CfUserService { publishReplay(1), refCount() ); - } + }; private parseOrgRole( user: CfUser, @@ -260,7 +260,7 @@ export class CfUserService { }), first() ); - } + }; getUserRoleInSpace = ( userGuid: string, @@ -276,7 +276,7 @@ export class CfUserService { ); }) ); - } + }; fetchTotalUsers(cfGuid: string, orgGuid?: string, spaceGuid?: string): Observable { return this.isConnectedUserAdmin(cfGuid).pipe( @@ -447,7 +447,7 @@ export class CfUserService { private createCfGetAllUsersAction = (cfGuid: string): PaginatedAction => { return cfEntityCatalog.user.actions.getMultiple(cfGuid, null); - } + }; private createOrgGetUsersAction = (isAdmin: boolean, cfGuid: string, orgGuid: string): PaginatedAction => { return cfEntityCatalog.user.actions.getAllInOrganization( @@ -456,21 +456,21 @@ export class CfUserService { createEntityRelationPaginationKey(organizationEntityType, orgGuid), isAdmin ); - } + }; - private createSpaceGetUsersAction = (isAdmin: boolean, cfGuid: string, spaceGuid: string, ): PaginatedAction => { + private createSpaceGetUsersAction = (isAdmin: boolean, cfGuid: string, spaceGuid: string): PaginatedAction => { return cfEntityCatalog.user.actions.getAllInSpace( spaceGuid, cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid), isAdmin ); - } + }; public isConnectedUserAdmin = (cfGuid: string): Observable => this.store.select(getCurrentUserCFGlobalStates(cfGuid)).pipe( filter(state => !!state), map(state => state.isAdmin), first() - ) + ); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts deleted file mode 100644 index 915eae9576..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { flattenPagination } from '@stratosui/store'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { getGitHubAPIURL } from '../../../../../core/src/core/github.helpers'; -import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; -import { - GITHUB_PER_PAGE_PARAM, - GITHUB_PER_PAGE_PARAM_VALUE, - GithubFlattenerForArrayPaginationConfig, - GithubFlattenerPaginationConfig, -} from './github-pagination.helper'; -import { GitSCM, SCMIcon } from './scm'; -import { GitSCMType } from './scm.service'; - -export class GitHubSCM implements GitSCM { - - constructor(public gitHubURL: string) { - this.gitHubURL = this.gitHubURL || getGitHubAPIURL(); - } - - getType(): GitSCMType { - return 'github'; - } - - getLabel(): string { - return 'GitHub'; - } - - getIcon(): SCMIcon { - return { - iconName: 'github', - fontName: 'stratos-icons' - }; - } - - getRepository(httpClient: HttpClient, projectName: string): Observable { - return httpClient.get(`${this.gitHubURL}/repos/${projectName}`) as Observable; - } - - getBranch(httpClient: HttpClient, projectName: string, branchName: string): Observable { - return httpClient.get(`${this.gitHubURL}/repos/${projectName}/branches/${branchName}`) as Observable; - } - - getBranches(httpClient: HttpClient, projectName: string): Observable { - const url = `${this.gitHubURL}/repos/${projectName}/branches`; - const config = new GithubFlattenerForArrayPaginationConfig(httpClient, url) - const firstRequest = config.fetch(...config.buildFetchParams(1)) - return flattenPagination( - null, - firstRequest, - config - ) - } - - getCommit(httpClient: HttpClient, projectName: string, commitSha: string): Observable { - return httpClient.get(this.getCommitApiUrl(projectName, commitSha)) as Observable; - } - - getCommitApiUrl(projectName: string, commitSha: string) { - return `${this.gitHubURL}/repos/${projectName}/commits/${commitSha}`; - } - - getCommits(httpClient: HttpClient, projectName: string, ref: string): Observable { - return httpClient.get( - `${this.gitHubURL}/repos/${projectName}/commits?sha=${ref}`, { - params: { - [GITHUB_PER_PAGE_PARAM]: GITHUB_PER_PAGE_PARAM_VALUE.toString() - } - }); - } - - getCloneURL(projectName: string): string { - return `https://github.com/${projectName}`; - } - - getCommitURL(projectName: string, commitSha: string): string { - return `https://github.com/${projectName}/commit/${commitSha}`; - } - - getCompareCommitURL(projectName: string, commitSha1: string, commitSha2: string): string { - return `https://github.com/${projectName}/compare/${commitSha1}...${commitSha2}`; - } - - getMatchingRepositories(httpClient: HttpClient, projectName: string): Observable { - const prjParts = projectName.split('/'); - let url = `${this.gitHubURL}/search/repositories?q=${projectName}+in:name+fork:true`; - if (prjParts.length > 1) { - url = `${this.gitHubURL}/search/repositories?q=${prjParts[1]}+in:name+fork:true+user:${prjParts[0]}`; - } - - const config = new GithubFlattenerPaginationConfig(httpClient, url) - const firstRequest = config.fetch(...config.buildFetchParams(1)) - return flattenPagination( - null, - firstRequest, - config - ).pipe( - map(repos => { - return repos.map(item => item.full_name); - }) - ) - } - - public convertCommit(projectName: string, commit: any): GitCommit { - return commit; - } - -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts deleted file mode 100644 index badb54157d..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { HttpClient, HttpErrorResponse } from '@angular/common/http'; -import { combineLatest, Observable, of as observableOf, of } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; -import { Md5 } from 'ts-md5/dist/md5'; - -import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; -import { GitSCM, SCMIcon } from './scm'; -import { GitSCMType } from './scm.service'; - -const gitLabAPIUrl = 'https://gitlab.com/api/v4'; -const GITLAB_PER_PAGE_PARAM = 'per_page'; -const GITLAB_PER_PAGE_PARAM_VALUE = 100; - -export class GitLabSCM implements GitSCM { - - getType(): GitSCMType { - return 'gitlab'; - } - - getLabel(): string { - return 'GitLab'; - } - - getIcon(): SCMIcon { - return { - iconName: 'gitlab', - fontName: 'stratos-icons' - }; - } - - getRepository(httpClient: HttpClient, projectName: string): Observable { - const parts = projectName.split('/'); - - const obs$ = parts.length !== 2 ? - observableOf(null) : - httpClient.get(`${gitLabAPIUrl}/projects/${parts.join('%2F')}`); - - return obs$.pipe( - map((data: any) => { - if (!data) { - throw new HttpErrorResponse({ - status: 404 - }); - } - return this.convertProject(data); - }) - ); - } - - getBranch(httpClient: HttpClient, projectName: string, branchName: string): Observable { - const prjNameEncoded = encodeURIComponent(projectName); - return httpClient.get(`${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/branches/${branchName}`).pipe( - map((data: any) => { - const nb = { ...data }; - nb.commit.sha = nb.commit.id; - return nb; - }) - ); - } - - getBranches(httpClient: HttpClient, projectName: string): Observable { - const prjNameEncoded = encodeURIComponent(projectName); - return httpClient.get( - `${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/branches`, { - params: { - [GITLAB_PER_PAGE_PARAM]: GITLAB_PER_PAGE_PARAM_VALUE.toString() - } - } - ).pipe( - map((data: any) => { - const branches = []; - data.forEach(b => { - const nb = { ...b }; - nb.commit.sha = b.commit.id; - branches.push(nb); - }); - return branches; - }) - ); - } - - getCommit(httpClient: HttpClient, projectName: string, commitSha: string): Observable { - return httpClient.get(this.getCommitApiUrl(projectName, commitSha)).pipe( - map(data => { - return this.convertCommit(projectName, data); - }) - ); - } - - getCommitApiUrl(projectName: string, commitSha: string, ): string { - const prjNameEncoded = encodeURIComponent(projectName); - return `${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/commits/${commitSha}`; - } - - getCommits(httpClient: HttpClient, projectName: string, commitSha: string): Observable { - const prjNameEncoded = encodeURIComponent(projectName); - return httpClient.get( - `${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/commits?ref_name=${commitSha}`, { - params: { - [GITLAB_PER_PAGE_PARAM]: GITLAB_PER_PAGE_PARAM_VALUE.toString() - } - } - ).pipe( - map((data: any) => { - const commits = []; - data.forEach(c => commits.push(this.convertCommit(projectName, c))); - return commits; - }) - ); - } - - getCloneURL(projectName: string): string { - return `https://gitlab.com/${projectName}.git`; - } - - getCommitURL(projectName: string, commitSha: string): string { - return `https://gitlab.com/${projectName}/commit/${commitSha}`; - } - - getCompareCommitURL(projectName: string, commitSha1: string, commitSha2: string): string { - return `https://gitlab.com/${projectName}/compare/${commitSha1}...${commitSha2}`; - } - - getMatchingRepositories(httpClient: HttpClient, projectName: string): Observable { - const prjParts = projectName.split('/'); - - const obs$ = prjParts.length > 1 ? - this.getMatchingUserGroupRepositories(httpClient, prjParts) : - httpClient.get(`${gitLabAPIUrl}/projects?search=${projectName}`, { - params: { - [GITLAB_PER_PAGE_PARAM]: GITLAB_PER_PAGE_PARAM_VALUE.toString() - } - }); - - return obs$.pipe( - map((repos: any[]) => repos.map(item => item.path_with_namespace)), - ); - } - - private getMatchingUserGroupRepositories(httpClient: HttpClient, prjParts: string[]): Observable { - return combineLatest([ - httpClient.get<[]>(`${gitLabAPIUrl}/users/${prjParts[0]}/projects/?search=${prjParts[1]}`).pipe(catchError(() => of([]))), - httpClient.get<[]>(`${gitLabAPIUrl}/groups/${prjParts[0]}/projects?search=${prjParts[1]}`).pipe(catchError(() => of([]))), - ]).pipe( - map(([a, b]: [any[], any[]]) => a.concat(b)), - ) - } - - private convertProject(prj: any): GitRepo { - return { - ...prj, - full_name: prj.path_with_namespace, - description: prj.description || prj.name_with_namespace, - html_url: prj.web_url, - owner: { - name: prj.namespace.name, - avatar_url: prj.avatar_url || '/core/assets/gitlab-logo.svg' - } - }; - } - - public convertCommit(projectName: string, commit: any): GitCommit { - const emailMD5 = Md5.hashStr(commit.author_email); - const avatarURL = `https://secure.gravatar.com/avatar/${emailMD5}?s=120&d=identicon`; - - return { - html_url: this.getCommitURL(projectName, commit.id), - author: { - id: null, - login: null, - avatar_url: avatarURL, - html_url: null - }, - commit: { - author: { - date: commit.created_at, - name: commit.author_name, - email: commit.author_email - }, - message: commit.message, - }, - sha: commit.id - }; - } - -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.spec.ts index c8ec0fdd99..adf0f4207c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.spec.ts @@ -9,9 +9,9 @@ import { createBasicStoreModule } from '@stratosui/store/testing'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { ExtensionService } from '../../../../../core/src/core/extension/extension-service'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../core/src/core/github.helpers'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { CoreTestingModule } from '../../../../../core/test-framework/core-test.modules'; +import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../git/src/shared/github.helpers'; import { AppStoreModule } from '../../../../../store/src/store.module'; import { CFAppState } from '../../../cf-app-state'; import { ActiveRouteCfOrgSpace } from '../../../features/cf/cf-page.types'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.ts b/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.ts index 59870a82a3..774226f928 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.ts @@ -63,7 +63,7 @@ export class AppNameUniqueDirective implements AsyncValidator, OnInit { this.appApplicationNameUnique.set(false); } - public validate(control: AbstractControl): Observable<{ appNameTaken: boolean; } | null> { + public validate(control: AbstractControl): Observable<{ appNameTaken: boolean, } | null> { if (!control.dirty) { return observableOf(null); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions-and-cfchecker.service.spec.ts similarity index 98% rename from src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions.service.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions-and-cfchecker.service.spec.ts index ddf7d54350..0852f7e8b2 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/services/current-user-permissions-and-cfchecker.service.spec.ts @@ -2,16 +2,6 @@ import { TestBed } from '@angular/core/testing'; import { createBasicStoreModule, createEntityStoreState, TestStoreEntity } from '@stratosui/store/testing'; import { first, tap } from 'rxjs/operators'; -import { CFFeatureFlagTypes, IFeatureFlag } from '../../../../cloud-foundry/src/cf-api.types'; -import { cfEntityFactory } from '../../../../cloud-foundry/src/cf-entity-factory'; -import { generateCFEntities } from '../../../../cloud-foundry/src/cf-entity-generator'; -import { featureFlagEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; -import { - CfCurrentUserPermissions, - cfCurrentUserPermissionsService, - CfPermissionTypes, - CfScopeStrings, -} from '../../../../cloud-foundry/src/user-permissions/cf-user-permissions-checkers'; import { PermissionConfig } from '../../../../core/src/core/permissions/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../core/src/core/permissions/current-user-permissions.service'; import { StratosScopeStrings } from '../../../../core/src/core/permissions/stratos-user-permissions.checker'; @@ -25,6 +15,16 @@ import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; import { BaseEntityValues } from '../../../../store/src/types/entity.types'; import { PaginationState } from '../../../../store/src/types/pagination.types'; +import { CFFeatureFlagTypes, IFeatureFlag } from '../../cf-api.types'; +import { cfEntityFactory } from '../../cf-entity-factory'; +import { generateCFEntities } from '../../cf-entity-generator'; +import { featureFlagEntityType } from '../../cf-entity-types'; +import { + CfCurrentUserPermissions, + cfCurrentUserPermissionsService, + CfPermissionTypes, + CfScopeStrings, +} from '../../user-permissions/cf-user-permissions-checkers'; const ffSchema = cfEntityFactory(featureFlagEntityType); @@ -520,7 +520,8 @@ describe('CurrentUserPermissionsService with CF checker', () => { }, totalResults: 2 }, - maxedState: {} + maxedState: {}, + isListPagination: true } }, cfFeatureFlag: { @@ -548,7 +549,8 @@ describe('CurrentUserPermissionsService with CF checker', () => { }, totalResults: 13 }, - maxedState: {} + maxedState: {}, + isListPagination: false }, 'endpoint-c80420ca-204b-4879-bf69-b6b7a202ad87': { pageCount: 1, @@ -574,7 +576,8 @@ describe('CurrentUserPermissionsService with CF checker', () => { }, totalResults: 13 }, - maxedState: {} + maxedState: {}, + isListPagination: false } }, }; diff --git a/src/frontend/packages/cloud-foundry/src/store/cloud-foundry.store.module.ts b/src/frontend/packages/cloud-foundry/src/store/cloud-foundry.store.module.ts index 0d49b902db..ab88ddfe13 100644 --- a/src/frontend/packages/cloud-foundry/src/store/cloud-foundry.store.module.ts +++ b/src/frontend/packages/cloud-foundry/src/store/cloud-foundry.store.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; +import { GitPackageModule } from '@stratosui/git'; import { ActiveRouteCfOrgSpace } from '../features/cf/cf-page.types'; import { CloudFoundryReducersModule } from './cloud-foundry.reducers.module'; @@ -8,7 +9,6 @@ import { AppEffects } from './effects/app.effects'; import { CloudFoundryEffects } from './effects/cloud-foundry.effects'; import { CreateAppPageEffects } from './effects/create-app-effects'; import { DeployAppEffects } from './effects/deploy-app.effects'; -import { GithubEffects } from './effects/github.effects'; import { CfValidateEffects } from './effects/request.effects'; import { RouteEffect } from './effects/route.effects'; import { ServiceInstanceEffects } from './effects/service-instance.effects'; @@ -22,7 +22,6 @@ import { UsersRolesEffects } from './effects/users-roles.effects'; CreateAppPageEffects, AppVariablesEffect, DeployAppEffects, - GithubEffects, CloudFoundryEffects, RouteEffect, ServiceInstanceEffects, @@ -30,7 +29,9 @@ import { UsersRolesEffects } from './effects/users-roles.effects'; UpdateAppEffects, CfValidateEffects, UsersRolesEffects - ]) + ]), + // Brings in GitSCMService + GitPackageModule, ], providers: [ { diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/app-variables.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/app-variables.effects.ts index 43a64dac5a..f47d0b266e 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/app-variables.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/app-variables.effects.ts @@ -23,5 +23,5 @@ export class AppVariablesEffect { null, [AppMetadataTypes.ENV_VARS] )) - ) + ); } diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts index 76926a21da..e609848843 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts @@ -24,7 +24,7 @@ export class AppEffects { @Effect({ dispatch: false }) updateSummary$ = this.actions$.pipe( ofType(ASSIGN_ROUTE_SUCCESS), map(action => { - cfEntityCatalog.appSummary.api.get(action.apiAction.guid, action.apiAction.endpointGuid) + cfEntityCatalog.appSummary.api.get(action.apiAction.guid, action.apiAction.endpointGuid); }), ); diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts index c840fe50b1..7efe080d09 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts @@ -2,65 +2,28 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; +import { GitSCMService } from '@stratosui/git'; import { of as observableOf } from 'rxjs'; -import { catchError, filter, map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators'; +import { catchError, filter, map, switchMap, withLatestFrom } from 'rxjs/operators'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; -import { NormalizedResponse } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { - ICFAction, - StartRequestAction, - WrapperRequestActionFailed, - WrapperRequestActionSuccess, -} from '../../../../store/src/types/request.types'; import { CHECK_PROJECT_EXISTS, CheckProjectExists, - FETCH_BRANCH_FOR_PROJECT, - FETCH_BRANCHES_FOR_PROJECT, - FETCH_COMMIT, - FETCH_COMMITS, - FetchBranchesForProject, - FetchBranchForProject, - FetchCommit, - FetchCommits, ProjectDoesntExist, ProjectExists, ProjectFetchFail, } from '../../actions/deploy-applications.actions'; import { CFAppState } from '../../cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType } from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { selectDeployAppState } from '../selectors/deploy-application.selector'; -import { GitCommit } from '../types/git.types'; - -function parseHttpPipeError(res: any): { message?: string } { - if (!res.status) { - return res; - } - try { - return res.json ? res.json() : res; - } catch (e) { - console.warn('Failed to parse response body', e); - } - return {}; -} -export function createFailedGithubRequestMessage(error: any) { - const response = parseHttpPipeError(error); - const message = response.message || ''; - return error.status === 403 && message.startsWith('API rate limit exceeded for') ? - 'Git ' + message.substring(0, message.indexOf('(')) : - 'Git request failed'; -} @Injectable() export class DeployAppEffects { constructor( private actions$: Actions, private store: Store, - private httpClient: HttpClient + private httpClient: HttpClient, + private gitSCMService: GitSCMService ) { } @Effect() @@ -75,152 +38,10 @@ export class DeployAppEffects { map(res => new ProjectExists(action.projectName, res)), catchError(err => observableOf(err.status === 404 ? new ProjectDoesntExist(action.projectName) : - new ProjectFetchFail(action.projectName, createFailedGithubRequestMessage(err)) + new ProjectFetchFail(action.projectName, action.scm.parseErrorAsString(err)) )) ); }) ); - @Effect() - fetchBranches$ = this.actions$.pipe( - ofType(FETCH_BRANCHES_FOR_PROJECT), - mergeMap(action => { - const actionType = 'fetch'; - const apiAction = { - entityType: gitBranchesEntityType, - endpointType: CF_ENDPOINT_TYPE, - type: action.type, - paginationKey: action.paginationKey - } as PaginatedAction; - this.store.dispatch(new StartRequestAction(apiAction, actionType)); - return action.scm.getBranches(this.httpClient, action.projectName).pipe( - mergeMap(branches => { - const entityKey = entityCatalog.getEntity(apiAction).entityKey; - const mappedData: NormalizedResponse = { - entities: { [entityKey]: {} }, - result: [] - }; - - const scmType = action.scm.getType(); - branches.forEach(b => { - const id = `${scmType}-${action.projectName}-${b.name}`; - b.projectId = action.projectName; - b.entityId = id; - // mappedData.entities[entityKey][id] = { - // entity: b, - // metadata: {} - // }; - mappedData.entities[entityKey][id] = b; - mappedData.result.push(id); - }); - return [ - new WrapperRequestActionSuccess(mappedData, apiAction, actionType) - ]; - }), - catchError(err => [ - new WrapperRequestActionFailed(createFailedGithubRequestMessage(err), apiAction, actionType) - ])); - })); - - @Effect() - fetchBranch$ = this.actions$.pipe( - ofType(FETCH_BRANCH_FOR_PROJECT), - mergeMap(action => { - const actionType = 'fetch'; - const apiAction = { - entityType: gitBranchesEntityType, - endpointType: CF_ENDPOINT_TYPE, - type: action.type, - guid: action.guid - }; - this.store.dispatch(new StartRequestAction(apiAction, actionType)); - return action.scm.getBranch(this.httpClient, action.projectName, action.branchName).pipe( - mergeMap(branch => { - const entityKey = entityCatalog.getEntity(apiAction).entityKey; - const mappedData: NormalizedResponse = { - entities: { [entityKey]: {} }, - result: [] - }; - branch.projectId = action.projectName; - branch.entityId = action.guid; - mappedData.entities[entityKey][action.guid] = branch; - mappedData.result.push(action.guid); - return [ - new WrapperRequestActionSuccess(mappedData, apiAction, actionType) - ]; - }), - catchError(err => [ - new WrapperRequestActionFailed(createFailedGithubRequestMessage(err), apiAction, actionType) - ])); - })); - - @Effect() - fetchCommit$ = this.actions$.pipe( - ofType(FETCH_COMMIT), - mergeMap(action => { - const actionType = 'fetch'; - const apiAction = { - entityType: gitCommitEntityType, - endpointType: CF_ENDPOINT_TYPE, - type: action.type, - } as ICFAction; - this.store.dispatch(new StartRequestAction(apiAction, actionType)); - return action.scm.getCommit(this.httpClient, action.projectName, action.commitSha).pipe( - mergeMap(commit => { - const entityKey = entityCatalog.getEntity(apiAction).entityKey; - const mappedData = { - entities: { [entityKey]: {} }, - result: [] - } as NormalizedResponse; - this.addCommit(entityKey, mappedData, action.scm.getType(), action.projectName, commit); - return [ - new WrapperRequestActionSuccess(mappedData, apiAction, actionType) - ]; - }), - catchError(err => [ - new WrapperRequestActionFailed(createFailedGithubRequestMessage(err), apiAction, actionType) - ])); - })); - - @Effect() - fetchCommits$ = this.actions$.pipe( - ofType(FETCH_COMMITS), - mergeMap(action => { - const actionType = 'fetch'; - const apiAction = { - entityType: gitCommitEntityType, - endpointType: CF_ENDPOINT_TYPE, - type: action.type, - paginationKey: action.paginationKey - } as PaginatedAction; - this.store.dispatch(new StartRequestAction(apiAction, actionType)); - return action.scm.getCommits(this.httpClient, action.projectName, action.sha).pipe( - mergeMap((commits: GitCommit[]) => { - const entityKey = entityCatalog.getEntity(apiAction).entityKey; - const mappedData = { - entities: { [entityKey]: {} }, - result: [] - } as NormalizedResponse; - commits.forEach(commit => { - this.addCommit(entityKey, mappedData, action.scm.getType(), action.projectName, commit); - }); - return [ - new WrapperRequestActionSuccess(mappedData, apiAction, actionType) - ]; - }), - catchError(err => [ - new WrapperRequestActionFailed(createFailedGithubRequestMessage(err), apiAction, actionType) - ])); - })); - - addCommit(entityKey: string, mappedData: NormalizedResponse, scmType: string, projectName: string, commit: GitCommit) { - const id = scmType + '-' + projectName + '-' + commit.sha; // FIXME: get from action, see #4245 - mappedData.entities[entityKey][id] = commit; - // mappedData.entities[entityKey][id] = { - // entity: commit, - // metadata: {} - // }; - mappedData.result.push(id); - } - } diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts deleted file mode 100644 index cf534bc46a..0000000000 --- a/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { catchError, mergeMap } from 'rxjs/operators'; - -import { NormalizedResponse } from '../../../../store/src/types/api.types'; -import { - StartRequestAction, - WrapperRequestActionFailed, - WrapperRequestActionSuccess, -} from '../../../../store/src/types/request.types'; -import { FETCH_GITHUB_REPO, FetchGitHubRepoInfo } from '../../actions/github.actions'; -import { CFAppState } from '../../cf-app-state'; -import { gitRepoEntityType } from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { GitSCMService } from '../../shared/data-services/scm/scm.service'; -import { createFailedGithubRequestMessage } from './deploy-app.effects'; - -// TODO: Remove this in favour of action builder config. -// https://github.com/cloudfoundry-incubator/stratos/issues/3770 -@Injectable() -export class GithubEffects { - // FIXME: This should be removed in favour of entity action builder config. - // See github commit action builder for an example, - // https://github.com/cloudfoundry-incubator/stratos/issues/3770 - constructor( - private actions$: Actions, - private store: Store, - private scmService: GitSCMService, - private httpClient: HttpClient - ) { } - @Effect() - fetchRep$ = this.actions$.pipe( - ofType(FETCH_GITHUB_REPO), - mergeMap(action => { - const actionType = 'fetch'; - const apiAction = { - entityType: gitRepoEntityType, - endpointType: CF_ENDPOINT_TYPE, - type: action.type, - guid: action.guid - }; - this.store.dispatch(new StartRequestAction(apiAction, actionType)); - return action.meta.scm.getRepository(this.httpClient, action.meta.projectName).pipe( - mergeMap(repoDetails => { - const mappedData = { - entities: { cfGitRepo: {} }, - result: [] - } as NormalizedResponse; - mappedData.entities.cfGitRepo[action.guid] = repoDetails; - mappedData.result.push(action.guid); - return [ - new WrapperRequestActionSuccess(mappedData, apiAction, actionType) - ]; - }), - catchError(err => [ - new WrapperRequestActionFailed(createFailedGithubRequestMessage(err), apiAction, actionType) - ] - )); - })); -} diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts index 7c080b69e1..62fccdcf8e 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts @@ -28,7 +28,10 @@ export class UpdateAppEffects { actions.push(cfEntityCatalog.appEnvVar.actions.getMultiple(action.apiAction.guid, action.apiAction.endpointGuid)); break; case AppMetadataTypes.STATS: - const statsAction = cfEntityCatalog.appStats.actions.getMultiple(action.apiAction.guid, action.apiAction.endpointGuid as string) + const statsAction = cfEntityCatalog.appStats.actions.getMultiple( + action.apiAction.guid, + action.apiAction.endpointGuid as string + ); // Application has changed and the associated app stats need to also be updated. // Apps that are started can just make the stats call to update cached stats, however this call will fail for stopped apps. // For those cases create a fake stats request response that should result in the same thing diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/current-cf-user-roles-reducer/current-cf-user-roles.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/current-cf-user-roles-reducer/current-cf-user-roles.reducer.ts index 89a24cc8e5..5872eb37e4 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/current-cf-user-roles-reducer/current-cf-user-roles.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/current-cf-user-roles-reducer/current-cf-user-roles.reducer.ts @@ -42,7 +42,7 @@ export const currentCfUserRolesReducer: EntityUserRolesReducer ): IAllCfRolesState => { switch (action.type) { case GET_CURRENT_CF_USER_RELATION_SUCCESS: - const gcursAction = action as GetCurrentCfUserRelationsComplete + const gcursAction = action as GetCurrentCfUserRelationsComplete; return currentUserBaseCFRolesReducer(state, gcursAction); case SESSION_VERIFIED: return cfRoleInfoFromSessionReducer(state, action as VerifiedSession); @@ -67,7 +67,7 @@ export const currentCfUserRolesReducer: EntityUserRolesReducer return currentUserCfRolesRequestStateReducer(state, action as GetCfUserRelations); } return null; -} +}; export function currentUserCfRolesRequestStateReducer(cf: IAllCfRolesState = {}, action: GetCfUserRelations) { const cfGuid = (action as GetCfUserRelations).cfGuid; @@ -76,7 +76,7 @@ export function currentUserCfRolesRequestStateReducer(cf: IAllCfRolesState = {}, RolesRequestStateStage.START : action.type === GET_CURRENT_CF_USER_RELATIONS_SUCCESS ? RolesRequestStateStage.SUCCESS : action.type === GET_CURRENT_CF_USER_RELATIONS_FAILED ? RolesRequestStateStage.FAILURE : - RolesRequestStateStage.OTHER + RolesRequestStateStage.OTHER; return { ...cf, [cfGuid]: { diff --git a/src/frontend/packages/cloud-foundry/src/store/types/cf-current-user-roles.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/cf-current-user-roles.types.ts index 83640a6cf8..fec61b316a 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/cf-current-user-roles.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/cf-current-user-roles.types.ts @@ -39,5 +39,5 @@ export interface ICfRolesState { } export interface IAllCfRolesState { - [guid: string]: ICfRolesState + [guid: string]: ICfRolesState; } diff --git a/src/frontend/packages/cloud-foundry/src/store/types/deploy-application.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/deploy-application.types.ts index a1ddcd2208..6b673f0bf0 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/deploy-application.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/deploy-application.types.ts @@ -1,10 +1,12 @@ +import { GitBranch } from '@stratosui/git'; + import { ITileGraphic } from '../../../../core/src/shared/components/tile/tile-selector.types'; import { NewAppCFDetails } from './create-application.types'; -import { GitBranch } from './git.types'; export interface SourceType { name: string; id: string; + endpointGuid?: string; helpText?: string; disabledText?: string; group?: string; @@ -68,6 +70,7 @@ export interface DockerAppDetails { export interface GitAppDetails { projectName: string; branch: GitBranch; + endpointGuid: string; commit?: string; branchName?: string; url?: string; diff --git a/src/frontend/packages/cloud-foundry/src/store/types/git.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/git.types.ts deleted file mode 100644 index 61cd22f069..0000000000 --- a/src/frontend/packages/cloud-foundry/src/store/types/git.types.ts +++ /dev/null @@ -1,42 +0,0 @@ - -export interface GitRepo { - pushed_at?: string; - last_activity_at?: string; - created_at: string; - owner: GitUser; - id: number; - full_name: string; - default_branch: string; - description: string; -} - -export interface GitUser { - avatar_url: string; - html_url: string; - id: number; - login: string; -} - -export interface GitBranch { - name: string; - commit?: GitCommit; - projectId?: string; - entityId?: string; -} - -export interface GitCommit { - sha: string; - author?: GitUser; - committer?: GitUser; - html_url?: string; - commit?: { - author: { - date: string; - email: string; - name: string; - }; - message: string; - }; - guid?: string; -} - diff --git a/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts deleted file mode 100644 index 73f6b888ad..0000000000 --- a/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts +++ /dev/null @@ -1,39 +0,0 @@ -export interface GithubRepo { - pushed_at: string; - created_at: string; - owner: GithubUser; - id: number; - full_name: string; - default_branch: string; - description: string; -} - -export interface GithubUser { - avatar_url: string; - html_url: string; - id: number; - login: string; - type: string; -} - -export interface GitHubBranch { - name: string; - commit?: GithubCommit; -} - -export interface GithubCommit { - sha: string; - url: string; - author?: GithubUser; - committer?: GithubUser; - html_url?: string; - commit?: { - author: { - date: string; - email: string; - name: string; - }; - message: string; - }; -} - diff --git a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts index f30b7697b4..b34e52899b 100644 --- a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts +++ b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-permissions-checkers.ts @@ -219,7 +219,7 @@ export class CfUserPermissionsChecker extends BaseCurrentUserPermissionsChecker }), distinctUntilChanged(), ); - }; + } /** * @param permissionConfig Single permission to be checked @@ -493,6 +493,6 @@ export class CfUserPermissionsChecker extends BaseCurrentUserPermissionsChecker public getFallbackCheck(endpointGuid: string, endpointType: string) { return endpointType === CF_ENDPOINT_TYPE ? this.getCfAdminCheck(endpointGuid) : null; - }; + } -} \ No newline at end of file +} diff --git a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-roles-fetch.ts b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-roles-fetch.ts index e26807ae1b..1d9fcce434 100644 --- a/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-roles-fetch.ts +++ b/src/frontend/packages/cloud-foundry/src/user-permissions/cf-user-roles-fetch.ts @@ -145,7 +145,7 @@ function fetchCfUserRoles(endpoint: IEndpointConnectionInfo, store: Store implements PaginationFlattener { - constructor(httpClient: HttpClient, public url, public requestOptions: { [key: string]: any; }) { + constructor(httpClient: HttpClient, public url, public requestOptions: { [key: string]: any, }) { super(httpClient, url, requestOptions, 'page'); } public getTotalPages = (res: CFResponse) => res.total_pages; @@ -215,4 +215,4 @@ const createPaginationCompleteWatcher = (store: Store, action: BasePag }), skipWhile(completed => !completed), first(), - ); \ No newline at end of file + ); diff --git a/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts b/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts index 18ed991825..cfe7ea8960 100644 --- a/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts @@ -66,7 +66,7 @@ export class ApplicationServiceMock { } as EntityInfo>); appStats$: Observable = observableOf(new Array()); applicationStratProject$: Observable = - observableOf({ deploySource: { type: 'github', timestamp: 0, commit: '' }, deployOverrides: null }); + observableOf({ deploySource: { type: 'github', timestamp: 0, commit: '', endpointGuid: '' }, deployOverrides: null}); isFetchingApp$: Observable = observableOf(false); isFetchingEnvVars$: Observable = observableOf(false); isUpdatingEnvVars$: Observable = observableOf(false); diff --git a/src/frontend/packages/core/sass/_all-theme.scss b/src/frontend/packages/core/sass/_all-theme.scss index 1cb538fe61..35a77b74ea 100644 --- a/src/frontend/packages/core/sass/_all-theme.scss +++ b/src/frontend/packages/core/sass/_all-theme.scss @@ -53,13 +53,11 @@ @import './mat-desktop'; @import './fonts'; @import './ansi-colors'; -@import '../src/shared/components/favorites-global-list/favorites-global-list.component.theme'; -@import '../src/shared/components/favorites-meta-card/favorites-meta-card.component.theme'; - -@import '../../core/src/features/error-page/error-page/error-page.component.theme'; -@import '../../core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme'; -@import '../../core/src/features/metrics/metrics/metrics.component.theme'; - +@import '../src/features/home/home/favorites-meta-card/favorites-meta-card.component.theme'; +@import '../src/features/home//home/home-page-endpoint-card/home-page-endpoint-card.component.theme'; +@import '../src/features/error-page/error-page/error-page.component.theme'; +@import '../src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.theme'; +@import '../src/features/metrics/metrics/metrics.component.theme'; // Creates the app theme and applies it to the application // $theme = Angular Material Theme @@ -116,7 +114,6 @@ @include stateful-icon($theme, $app-theme); @include app-simple-usage-chart($theme, $app-theme); @include home-page-theme($theme, $app-theme); - @include favorites-global-list-theme($theme, $app-theme); @include favorites-meta-card-theme($theme, $app-theme); @include page-side-nav-theme($theme, $app-theme); @include entity-summary-title-theme($theme, $app-theme); @@ -129,5 +126,6 @@ @include metrics-component-theme($theme, $app-theme); @include intro-screen-theme($theme, $app-theme); @include app-json-view-theme($theme, $app-theme); + @include home-page-endpoint-card-theme($theme, $app-theme); } diff --git a/src/frontend/packages/core/sass/mat-desktop.scss b/src/frontend/packages/core/sass/mat-desktop.scss index dd073dffa5..16b85e10e9 100644 --- a/src/frontend/packages/core/sass/mat-desktop.scss +++ b/src/frontend/packages/core/sass/mat-desktop.scss @@ -108,7 +108,27 @@ $desktop-toggle-button-item-height: $desktop-menu-item-height - 2px; // Smaller page header .page-header .page-header__toolbar { + font-size: 18px; height: $desktop-page-header-height; + + h1 { + font-size: 18px; + } + + mat-icon { + font-size: 20px; + height: 20px; + line-height: 20px; + width: 20px; + } + + .page-header__notification-button .mat-badge-medium.mat-badge-overlap .mat-badge-content { + height: 18px; + line-height: 18px; + right: -8px; + top: -8px; + width: 18px; + } } .dashboard .dashboard__inner { diff --git a/src/frontend/packages/core/src/app.component.spec.ts b/src/frontend/packages/core/src/app.component.spec.ts index 1894f848e5..4b08b3b607 100644 --- a/src/frontend/packages/core/src/app.component.spec.ts +++ b/src/frontend/packages/core/src/app.component.spec.ts @@ -4,6 +4,7 @@ import { createBasicStoreModule } from '@stratosui/store/testing'; import { CoreTestingModule } from '../test-framework/core-test.modules'; import { AppComponent } from './app.component'; +import { CurrentUserPermissionsService } from './core/permissions/current-user-permissions.service'; import { LoggedInService } from './logged-in.service'; import { SharedModule } from './shared/shared.module'; @@ -15,7 +16,8 @@ describe('AppComponent', () => { AppComponent ], providers: [ - LoggedInService + LoggedInService, + CurrentUserPermissionsService, ], imports: [ SharedModule, diff --git a/src/frontend/packages/core/src/app.component.ts b/src/frontend/packages/core/src/app.component.ts index 7e7be0556e..7da78ac04c 100644 --- a/src/frontend/packages/core/src/app.component.ts +++ b/src/frontend/packages/core/src/app.component.ts @@ -68,6 +68,11 @@ export class AppComponent implements OnInit, OnDestroy, AfterContentInit { if (isDesktop) { this.document.body.classList.add('mat-desktop'); } + + // Desktop (Electron ?) + if (environment.desktopMode) { + this.document.body.classList.add('stratos-desktop'); + } } ngOnDestroy() { diff --git a/src/frontend/packages/core/src/app.module.ts b/src/frontend/packages/core/src/app.module.ts index 0ed0d1b159..2697e09541 100644 --- a/src/frontend/packages/core/src/app.module.ts +++ b/src/frontend/packages/core/src/app.module.ts @@ -5,6 +5,7 @@ import { Params, RouteReuseStrategy, RouterStateSnapshot } from '@angular/router import { DefaultRouterStateSerializer, RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store'; import { Store } from '@ngrx/store'; import { StoreDevtoolsModule } from '@ngrx/store-devtools'; +import { getGitHubAPIURL, GITHUB_API_URL } from '@stratosui/git'; import { debounceTime, filter, withLatestFrom } from 'rxjs/operators'; import { SetRecentlyVisitedEntityAction } from '../../store/src/actions/recently-visited.actions'; @@ -13,7 +14,6 @@ import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogHelper } from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; import { EntityCatalogHelpers } from '../../store/src/entity-catalog/entity-catalog.helper'; -import { FavoritesConfigMapper } from '../../store/src/favorite-config-mapper'; import { endpointEntityType, STRATOS_ENDPOINT_TYPE } from '../../store/src/helpers/stratos-entity-factory'; import { getAPIRequestDataState, selectEntity } from '../../store/src/selectors/api.selectors'; import { internalEventStateSelector } from '../../store/src/selectors/internal-events.selectors'; @@ -30,7 +30,6 @@ import { CoreModule } from './core/core.module'; import { CustomizationService } from './core/customizations.types'; import { DynamicExtensionRoutes } from './core/extension/dynamic-extension-routes'; import { ExtensionService } from './core/extension/extension-service'; -import { getGitHubAPIURL, GITHUB_API_URL } from './core/github.helpers'; import { CurrentUserPermissionsService } from './core/permissions/current-user-permissions.service'; import { CustomImportModule } from './custom-import.module'; import { environment } from './environments/environment'; @@ -133,7 +132,6 @@ export class AppModule { private store: Store, eventService: GlobalEventService, private userFavoriteManager: UserFavoriteManager, - private favoritesConfigMapper: FavoritesConfigMapper, ech: EntityCatalogHelper ) { EntityCatalogHelpers.SetEntityCatalogHelper(ech); @@ -152,7 +150,7 @@ export class AppModule { }); eventService.addEventConfig<{ count: number, - endpoint: EndpointModel + endpoint: EndpointModel; }>({ eventTriggered: (state: GeneralEntityAppState) => { const eventState = internalEventStateSelector(state); @@ -234,12 +232,11 @@ export class AppModule { ).subscribe( ([entities, recents]) => { Object.values(recents).forEach(recentEntity => { - const mapper = this.favoritesConfigMapper.getMapperFunction(recentEntity); const entityKey = entityCatalog.getEntityKey(recentEntity); if (entities[entityKey] && entities[entityKey][recentEntity.entityId]) { const entity = entities[entityKey][recentEntity.entityId]; - const entityToMetadata = this.favoritesConfigMapper.getEntityMetadata(recentEntity, entity); - const name = mapper(entityToMetadata).name; + const entityToMetadata = this.userFavoriteManager.getEntityMetadata(recentEntity, entity); + const name = entityToMetadata.name; if (name && name !== recentEntity.name) { // Update the entity name this.store.dispatch(new SetRecentlyVisitedEntityAction({ @@ -263,12 +260,11 @@ export class AppModule { }) : entityCatalog.getEntityKey(favorite); const entity = entities[entityKey][favorite.entityId || favorite.endpointId]; if (entity) { - const newMetadata = this.favoritesConfigMapper.getEntityMetadata(favorite, entity); + const newMetadata = this.userFavoriteManager.getEntityMetadata(favorite, entity); if (this.metadataHasChanged(favorite.metadata, newMetadata)) { - stratosEntityCatalog.userFavorite.api.updateFavorite({ - ...favorite, - metadata: newMetadata - }); + const fav = this.userFavoriteManager.getUserFavoriteFromObject(favorite); + fav.metadata = newMetadata; + stratosEntityCatalog.userFavorite.api.updateFavorite(fav); } } } diff --git a/src/frontend/packages/core/src/core/apiKey-auth-guard.service.ts b/src/frontend/packages/core/src/core/apiKey-auth-guard.service.ts index 70e965da23..7cb639208f 100644 --- a/src/frontend/packages/core/src/core/apiKey-auth-guard.service.ts +++ b/src/frontend/packages/core/src/core/apiKey-auth-guard.service.ts @@ -27,4 +27,4 @@ export class APIKeyAuthGuardService implements CanActivate { }) ); } -} \ No newline at end of file +} diff --git a/src/frontend/packages/core/src/core/core.types.ts b/src/frontend/packages/core/src/core/core.types.ts index db4506e865..1b55edbb9e 100644 --- a/src/frontend/packages/core/src/core/core.types.ts +++ b/src/frontend/packages/core/src/core/core.types.ts @@ -1,5 +1,5 @@ +import { HttpHeaders, HttpParams } from '@angular/common/http'; import { InjectionToken } from '@angular/core'; - import { Title } from '@angular/platform-browser'; export const APP_TITLE = new InjectionToken('appTitle'); @@ -7,3 +7,16 @@ export const APP_TITLE = new InjectionToken('appTitle'); export const appTitleFactory = (titleService: Title) => { return titleService.getTitle(); }; + +export class HttpOptions { + headers?: HttpHeaders | { + [header: string]: string | string[]; + }; + // observe?: 'response'; + params?: HttpParams | { + [param: string]: string | string[]; + }; + reportProgress?: boolean; + // responseType?: 'json'; + withCredentials?: boolean; +} diff --git a/src/frontend/packages/core/src/core/endpoint-auth.ts b/src/frontend/packages/core/src/core/endpoint-auth.ts index 0fa06e90d1..60384f3c47 100644 --- a/src/frontend/packages/core/src/core/endpoint-auth.ts +++ b/src/frontend/packages/core/src/core/endpoint-auth.ts @@ -6,15 +6,21 @@ import { } from '../features/endpoints/connect-endpoint-dialog/auth-forms/credentials-auth-form.component'; import { NoneAuthFormComponent } from '../features/endpoints/connect-endpoint-dialog/auth-forms/none-auth-form.component'; import { SSOAuthFormComponent } from '../features/endpoints/connect-endpoint-dialog/auth-forms/sso-auth-form.component'; +import { + TokenEndpointComponent, +} from '../features/endpoints/connect-endpoint-dialog/auth-forms/token-endpoint/token-endpoint.component'; +// Possible auth types - depends on each back-end plugin as to which are supported export enum EndpointAuthTypeNames { CREDS = 'creds', + BEARER = 'bearer', + TOKEN = 'token', SSO = 'sso', NONE = 'none' } export abstract class BaseEndpointAuth { - static readonly UsernamePassword = { + static readonly UsernamePassword: EndpointAuthTypeConfig = { name: 'Username and Password', value: EndpointAuthTypeNames.CREDS, form: { @@ -22,22 +28,42 @@ export abstract class BaseEndpointAuth { password: ['', Validators.required], }, types: new Array(), - component: CredentialsAuthFormComponent - } as EndpointAuthTypeConfig; + component: CredentialsAuthFormComponent, + }; + + static readonly Bearer: EndpointAuthTypeConfig = { + name: 'Token', + value: EndpointAuthTypeNames.BEARER, + form: { + token: ['', Validators.required], + }, + types: new Array(), + component: TokenEndpointComponent + }; + + static readonly Token: EndpointAuthTypeConfig = { + name: 'Token', + value: EndpointAuthTypeNames.TOKEN, + form: { + token: ['', Validators.required], + }, + types: new Array(), + component: TokenEndpointComponent + }; - static readonly SSO = { + static readonly SSO: EndpointAuthTypeConfig = { name: 'Single Sign-On (SSO)', value: EndpointAuthTypeNames.SSO, form: {}, types: new Array(), component: SSOAuthFormComponent - } as EndpointAuthTypeConfig; + }; - static readonly None = { + static readonly None: EndpointAuthTypeConfig = { name: 'No Authentication', value: EndpointAuthTypeNames.NONE, form: {}, types: new Array(), component: NoneAuthFormComponent - } as EndpointAuthTypeConfig; + }; } diff --git a/src/frontend/packages/core/src/core/endpoints.service.ts b/src/frontend/packages/core/src/core/endpoints.service.ts index 8da0f1d610..f7860ba3c3 100644 --- a/src/frontend/packages/core/src/core/endpoints.service.ts +++ b/src/frontend/packages/core/src/core/endpoints.service.ts @@ -7,10 +7,12 @@ import { first, map, skipWhile, withLatestFrom } from 'rxjs/operators'; import { RouterNav } from '../../../store/src/actions/router.actions'; import { EndpointOnlyAppState, IRequestEntityTypeState } from '../../../store/src/app-state'; import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { EntityCatalogHelpers } from '../../../store/src/entity-catalog/entity-catalog.helper'; import { EndpointHealthCheck } from '../../../store/src/entity-catalog/entity-catalog.types'; import { AuthState } from '../../../store/src/reducers/auth.reducer'; import { endpointEntitiesSelector, endpointStatusSelector } from '../../../store/src/selectors/endpoint.selectors'; import { EndpointModel, EndpointState } from '../../../store/src/types/endpoint.types'; +import { IEndpointFavMetadata, UserFavorite } from '../../../store/src/types/user-favorites.types'; import { endpointHasMetricsByAvailable } from '../features/endpoints/endpoint-helpers'; import { EndpointHealthChecks } from './endpoints-health-checks'; import { UserService } from './user.service'; @@ -24,6 +26,7 @@ export class EndpointsService implements CanActivate { haveRegistered$: Observable; haveConnected$: Observable; disablePersistenceFeatures$: Observable; + connectedEndpoints$: Observable; static getLinkForEndpoint(endpoint: EndpointModel): string { if (!endpoint) { @@ -32,7 +35,14 @@ export class EndpointsService implements CanActivate { const catalogEntity = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type); const metadata = catalogEntity.builders.entityBuilder.getMetadata(endpoint); if (catalogEntity) { - return catalogEntity.builders.entityBuilder.getLink(metadata); + const fav = new UserFavorite( + endpoint.guid, + endpoint.cnsi_type, + EntityCatalogHelpers.endpointType, + null, + metadata + ); + return fav.getLink(); } return ''; } @@ -44,18 +54,17 @@ export class EndpointsService implements CanActivate { ) { this.endpoints$ = store.select(endpointEntitiesSelector); this.haveRegistered$ = this.endpoints$.pipe(map(endpoints => !!Object.keys(endpoints).length)); - this.haveConnected$ = this.endpoints$.pipe(map(endpoints => - !!Object.values(endpoints).find(endpoint => { + this.connectedEndpoints$ = this.endpoints$.pipe(map(endpoints => + Object.values(endpoints).filter(endpoint => { const epType = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type); if (!epType || !epType.definition) { return false; } const epEntity = epType.definition; - return epEntity.unConnectable || - endpoint.connectionStatus === 'connected' || - endpoint.connectionStatus === 'checking'; - })) - ); + return epEntity.unConnectable || endpoint.connectionStatus === 'connected' || endpoint.connectionStatus === 'checking'; + }) + )); + this.haveConnected$ = this.connectedEndpoints$.pipe(map(endpoints => endpoints.length > 0)); this.disablePersistenceFeatures$ = this.store.select('auth').pipe( map((auth) => auth.sessionData && diff --git a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.html b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.html index 4e8ff0b76e..2c5ff464c0 100644 --- a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.html +++ b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.html @@ -1,4 +1,5 @@ -
+
star star_border
\ No newline at end of file diff --git a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.scss b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.scss index c8793bce8e..c27f56975a 100644 --- a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.scss +++ b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.scss @@ -1,6 +1,19 @@ $size: 24px; +$small: 20px; .favorite-star { + align-items: center; cursor: pointer; + display: flex; height: $size; width: $size; + &__small { + height: $small; + width: $small; + mat-icon { + font-size: $small; + height: $small; + line-height: $small; + width: $small; + } + } } diff --git a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.spec.ts b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.spec.ts index 067a4e1f69..5b0c078512 100644 --- a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.spec.ts +++ b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.spec.ts @@ -2,7 +2,6 @@ import { OverlayContainer } from '@angular/cdk/overlay'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BehaviorSubject, of } from 'rxjs'; -import { FavoritesConfigMapper } from '../../../../store/src/favorite-config-mapper'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { IFavoriteMetadata, UserFavorite } from '../../../../store/src/types/user-favorites.types'; import { UserFavoriteManager } from '../../../../store/src/user-favorite-manager'; @@ -16,7 +15,6 @@ describe('EntityFavoriteStarComponent', () => { let fixture: ComponentFixture; let element: HTMLElement; let userFavoriteManager: UserFavoriteManager; - let favoritesConfigMapper: FavoritesConfigMapper; let favorite: UserFavorite; let overlayContainerElement: HTMLElement; @@ -35,7 +33,9 @@ describe('EntityFavoriteStarComponent', () => { declarations: [ DialogConfirmComponent ], - imports: [...BaseTestModulesNoShared,], + imports: [ + ...BaseTestModulesNoShared + ], }) .compileComponents(); })); @@ -43,7 +43,6 @@ describe('EntityFavoriteStarComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(EntityFavoriteStarComponent); userFavoriteManager = TestBed.get(UserFavoriteManager); - favoritesConfigMapper = TestBed.get(FavoritesConfigMapper); component = fixture.componentInstance; fixture.detectChanges(); element = fixture.nativeElement; @@ -70,7 +69,6 @@ describe('EntityFavoriteStarComponent', () => { it('should set isFavorite based on favorite', () => { spyOn(userFavoriteManager, 'getIsFavoriteObservable').and.returnValue(of(true)); - spyOn(favoritesConfigMapper, 'getPrettyTypeName').and.returnValue('prettyName'); component.favorite = favorite; fixture.detectChanges(); @@ -79,7 +77,6 @@ describe('EntityFavoriteStarComponent', () => { it('should set isFavorite based on favorite [2]', () => { spyOn(userFavoriteManager, 'getIsFavoriteObservable').and.returnValue(of(false)); - spyOn(favoritesConfigMapper, 'getPrettyTypeName').and.returnValue('prettyName'); component.favorite = favorite; fixture.detectChanges(); @@ -88,7 +85,6 @@ describe('EntityFavoriteStarComponent', () => { it('should toggle favorite if clicked', () => { const isFavorite$ = new BehaviorSubject(false); - spyOn(favoritesConfigMapper, 'getPrettyTypeName').and.returnValue('prettyName'); spyOn(userFavoriteManager, 'toggleFavorite').and.callFake(() => isFavorite$.next(!isFavorite$.getValue())); spyOn(userFavoriteManager, 'getIsFavoriteObservable').and.returnValue(isFavorite$); component.favorite = favorite; @@ -103,7 +99,6 @@ describe('EntityFavoriteStarComponent', () => { }); xit('should toggle even through confirmation dialog if confirm removal', () => { - spyOn(favoritesConfigMapper, 'getPrettyTypeName').and.returnValue('prettyName'); spyOn(userFavoriteManager, 'toggleFavorite'); spyOn(userFavoriteManager, 'getIsFavoriteObservable').and.returnValue(of(true)); component.confirmRemoval = true; diff --git a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.ts b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.ts index c345e7d523..e01afdbfa2 100644 --- a/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.ts +++ b/src/frontend/packages/core/src/core/entity-favorite-star/entity-favorite-star.component.ts @@ -2,7 +2,6 @@ import { Component, Input } from '@angular/core'; import { Observable } from 'rxjs'; import { first, tap } from 'rxjs/operators'; -import { FavoritesConfigMapper } from '../../../../store/src/favorite-config-mapper'; import { IFavoriteMetadata, UserFavorite } from '../../../../store/src/types/user-favorites.types'; import { UserFavoriteManager } from '../../../../store/src/user-favorite-manager'; import { ConfirmationDialogConfig } from '../../shared/components/confirmation-dialog.config'; @@ -18,7 +17,7 @@ export class EntityFavoriteStarComponent { @Input() set favorite(favorite: UserFavorite) { - const name = this.favoritesConfigMapper.getPrettyTypeName(favorite); + const name = favorite.getPrettyTypeName(); this.confirmationDialogConfig.message = `Are you sure you would you like to unfavorite this ${name ? name.toLocaleLowerCase() : 'favorite'}?`; this.isFavorite$ = this.userFavoriteManager.getIsFavoriteObservable(favorite); @@ -28,6 +27,8 @@ export class EntityFavoriteStarComponent { @Input() public confirmRemoval = false; + @Input() small = false; + public isFavorite$: Observable; private confirmationDialogConfig = new ConfirmationDialogConfig('Unfavorite?', '', 'Yes', true); @@ -38,7 +39,6 @@ export class EntityFavoriteStarComponent { private confirmDialog: ConfirmationDialogService, public endpointsService: EndpointsService, private userFavoriteManager: UserFavoriteManager, - private favoritesConfigMapper: FavoritesConfigMapper ) { } diff --git a/src/frontend/packages/core/src/core/extension/extension-service.ts b/src/frontend/packages/core/src/core/extension/extension-service.ts index 495dd76d8e..83ad3390c7 100644 --- a/src/frontend/packages/core/src/core/extension/extension-service.ts +++ b/src/frontend/packages/core/src/core/extension/extension-service.ts @@ -134,7 +134,7 @@ export class ExtensionService { // Declare extensions - this is a trick to ensure the Angular Build Optimiser does not // optimize out any extension components - public static declare(components: any[]): ModuleWithProviders { + public static declare(components: any[]): ModuleWithProviders { return { ngModule: ExtEmptyModule }; diff --git a/src/frontend/packages/core/src/core/md.module.ts b/src/frontend/packages/core/src/core/md.module.ts index 0e401fd3a8..044d0f7b9b 100644 --- a/src/frontend/packages/core/src/core/md.module.ts +++ b/src/frontend/packages/core/src/core/md.module.ts @@ -1,5 +1,4 @@ - - +import { ScrollingModule } from '@angular/cdk/scrolling'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MAT_MOMENT_DATE_FORMATS, MomentDateAdapter } from '@angular/material-moment-adapter'; @@ -10,7 +9,7 @@ import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; -import { DateAdapter, MAT_DATE_LOCALE, MAT_DATE_FORMATS } from '@angular/material/core'; +import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatDialogModule } from '@angular/material/dialog'; import { MatExpansionModule } from '@angular/material/expansion'; @@ -35,6 +34,8 @@ import { MatTabsModule } from '@angular/material/tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatTooltipModule } from '@angular/material/tooltip'; + + const importExport = [ CommonModule, MatButtonModule, @@ -66,7 +67,8 @@ const importExport = [ MatListModule, MatRadioModule, MatDatepickerModule, - MatBadgeModule + MatBadgeModule, + ScrollingModule, ]; @NgModule({ diff --git a/src/frontend/packages/core/src/core/permissions/current-user-permissions.service.spec.ts b/src/frontend/packages/core/src/core/permissions/current-user-permissions.service.spec.ts index 90d5401db5..9d7f3bb0af 100644 --- a/src/frontend/packages/core/src/core/permissions/current-user-permissions.service.spec.ts +++ b/src/frontend/packages/core/src/core/permissions/current-user-permissions.service.spec.ts @@ -124,7 +124,8 @@ describe('CurrentUserPermissionsService', () => { }, totalResults: 2 }, - maxedState: {} + maxedState: {}, + isListPagination: true } }, }; diff --git a/src/frontend/packages/core/src/core/permissions/current-user-permissions.types.ts b/src/frontend/packages/core/src/core/permissions/current-user-permissions.types.ts index 1314130007..60608d9879 100644 --- a/src/frontend/packages/core/src/core/permissions/current-user-permissions.types.ts +++ b/src/frontend/packages/core/src/core/permissions/current-user-permissions.types.ts @@ -21,7 +21,7 @@ export interface ICurrentUserPermissionsChecker { * If this is not supported by the the checker null is returned. If another checker also lays claim to the same string the check will * always return denied */ - getPermissionConfig: (action: string) => PermissionConfigType + getPermissionConfig: (action: string) => PermissionConfigType; /** * Simple checks are used when the permission config contains a single thing to check */ @@ -58,4 +58,4 @@ export abstract class BaseCurrentUserPermissionsChecker { distinctUntilChanged() ); } -} \ No newline at end of file +} diff --git a/src/frontend/packages/core/src/core/permissions/stratos-user-permissions.checker.ts b/src/frontend/packages/core/src/core/permissions/stratos-user-permissions.checker.ts index 98735c99cb..e3410a2a1f 100644 --- a/src/frontend/packages/core/src/core/permissions/stratos-user-permissions.checker.ts +++ b/src/frontend/packages/core/src/core/permissions/stratos-user-permissions.checker.ts @@ -22,10 +22,12 @@ import { export enum StratosCurrentUserPermissions { ENDPOINT_REGISTER = 'register.endpoint', PASSWORD_CHANGE = 'change-password', + EDIT_PROFILE = 'edit-profile', /** * Does the user have permission to view/create/delete their own API Keys? */ - API_KEYS = 'api-keys' + API_KEYS = 'api-keys', + CAN_NOT_LOGOUT = 'no-logout' } export enum StratosPermissionStrings { @@ -36,7 +38,9 @@ export enum StratosPermissionStrings { export enum StratosScopeStrings { STRATOS_CHANGE_PASSWORD = 'password.write', - SCIM_READ = 'scim.read' + SCIM_READ = 'scim.read', + SCIM_WRITE = 'scim.write', + STRATOS_NOAUTH = 'stratos.noauth' } export enum StratosPermissionTypes { @@ -57,11 +61,19 @@ export const stratosPermissionConfigs: IPermissionConfigs = { StratosPermissionTypes.STRATOS_SCOPE, StratosScopeStrings.STRATOS_CHANGE_PASSWORD ), - [StratosCurrentUserPermissions.API_KEYS]: new PermissionConfig(StratosPermissionTypes.API_KEY, '') + [StratosCurrentUserPermissions.EDIT_PROFILE]: new PermissionConfig( + StratosPermissionTypes.STRATOS_SCOPE, + StratosScopeStrings.SCIM_WRITE + ), + [StratosCurrentUserPermissions.API_KEYS]: new PermissionConfig(StratosPermissionTypes.API_KEY, ''), + [StratosCurrentUserPermissions.CAN_NOT_LOGOUT]: new PermissionConfig( + StratosPermissionTypes.STRATOS_SCOPE, + StratosScopeStrings.STRATOS_NOAUTH + ), }; export class StratosUserPermissionsChecker extends BaseCurrentUserPermissionsChecker implements ICurrentUserPermissionsChecker { - constructor(private store: Store,) { + constructor(private store: Store) { super(); } @@ -146,7 +158,7 @@ export class StratosUserPermissionsChecker extends BaseCurrentUserPermissionsChe } public getFallbackCheck(endpointGuid: string, endpointType: string): Observable { return null; - }; + } private groupConfigs(configs: PermissionConfig[]): IConfigGroups { return configs.reduce((grouped, config) => { diff --git a/src/frontend/packages/core/src/core/show-hide-button/show-hide-button.component.html b/src/frontend/packages/core/src/core/show-hide-button/show-hide-button.component.html index 7dfb234302..799384cec7 100644 --- a/src/frontend/packages/core/src/core/show-hide-button/show-hide-button.component.html +++ b/src/frontend/packages/core/src/core/show-hide-button/show-hide-button.component.html @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/src/frontend/packages/core/src/core/user-profile.service.ts b/src/frontend/packages/core/src/core/user-profile.service.ts index 0a496d3adc..75e5d18b5b 100644 --- a/src/frontend/packages/core/src/core/user-profile.service.ts +++ b/src/frontend/packages/core/src/core/user-profile.service.ts @@ -56,7 +56,7 @@ export class UserProfileService { switchMap(es => es.entityMonitor.entityRequest$), filter(requestInfo => !!requestInfo && !requestInfo.fetching), map(requestInfo => requestInfo.error) - ) + ); } fetchUserProfile() { diff --git a/src/frontend/packages/core/src/environments/environment.desktop.ts b/src/frontend/packages/core/src/environments/environment.desktop.ts new file mode 100644 index 0000000000..bdeea3adc5 --- /dev/null +++ b/src/frontend/packages/core/src/environments/environment.desktop.ts @@ -0,0 +1,12 @@ +import { cfAPIVersion, proxyAPIVersion } from '../../../store/src/jetstream'; + +export const environment = { + production: true, + proxyAPIVersion, + cfAPIVersion, + showObsDebug: false, + disablePolling: true, + desktopMode: true, + hideUserMenu: true, + fixedSideNav: true, +}; diff --git a/src/frontend/packages/core/src/environments/environment.prod.ts b/src/frontend/packages/core/src/environments/environment.prod.ts index 61c616a7fe..630f9a6591 100644 --- a/src/frontend/packages/core/src/environments/environment.prod.ts +++ b/src/frontend/packages/core/src/environments/environment.prod.ts @@ -5,5 +5,8 @@ export const environment = { proxyAPIVersion, cfAPIVersion, showObsDebug: false, - disablePolling: false + disablePolling: true, + desktopMode: false, + hideUserMenu: false, + fixedSideNav: false, }; diff --git a/src/frontend/packages/core/src/environments/environment.ts b/src/frontend/packages/core/src/environments/environment.ts index ee77d9adb8..f192836eaf 100644 --- a/src/frontend/packages/core/src/environments/environment.ts +++ b/src/frontend/packages/core/src/environments/environment.ts @@ -10,5 +10,8 @@ export const environment = { proxyAPIVersion, cfAPIVersion, showObsDebug: false, - disablePolling: false + disablePolling: false, + desktopMode: false, + hideUserMenu: false, + fixedSideNav: false, }; diff --git a/src/frontend/packages/core/src/features/about/about-page/about-page.component.ts b/src/frontend/packages/core/src/features/about/about-page/about-page.component.ts index 36812b60d1..b0d8069992 100644 --- a/src/frontend/packages/core/src/features/about/about-page/about-page.component.ts +++ b/src/frontend/packages/core/src/features/about/about-page/about-page.component.ts @@ -39,7 +39,7 @@ export class AboutPageComponent implements OnInit, OnDestroy { constructor( private store: Store, private resolver: ComponentFactoryResolver, - cs: CustomizationService + cs: CustomizationService, ) { this.customizations = cs.get(); } diff --git a/src/frontend/packages/core/src/features/api-keys/add-api-key-dialog/add-api-key-dialog.component.ts b/src/frontend/packages/core/src/features/api-keys/add-api-key-dialog/add-api-key-dialog.component.ts index eea0b54086..dbb9f993d0 100644 --- a/src/frontend/packages/core/src/features/api-keys/add-api-key-dialog/add-api-key-dialog.component.ts +++ b/src/frontend/packages/core/src/features/api-keys/add-api-key-dialog/add-api-key-dialog.component.ts @@ -20,7 +20,7 @@ export class AddApiKeyDialogComponent implements OnDestroy { private hasErrored = new BehaviorSubject(null); public hasErrored$ = this.hasErrored.asObservable(); - private isBusy = new BehaviorSubject(false) + private isBusy = new BehaviorSubject(false); public isBusy$ = this.isBusy.asObservable(); private sub: Subscription; @@ -56,11 +56,11 @@ export class AddApiKeyDialogComponent implements OnDestroy { } else { const response: NormalizedResponse = state.response; const entityKey = entityCatalog.getEntityKey(stratosEntityCatalog.apiKey.actions.create('')); - this.dialogRef.close(response.entities[entityKey][response.result[0]]) + this.dialogRef.close(response.entities[entityKey][response.result[0]]); } }), first() - ).subscribe() + ).subscribe(); } } diff --git a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.html b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.html index d7ca4b06f5..8f1388b896 100644 --- a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.html +++ b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.html @@ -33,7 +33,7 @@
-
+
@@ -42,9 +42,10 @@ -
+
diff --git a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.scss b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.scss index 34b3de01a3..fdceacd890 100644 --- a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.scss +++ b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.scss @@ -63,6 +63,10 @@ $app-header-height: 56px; min-width: auto; } } + &__side-narrow { + max-width: 400px; + min-width: 400px; + } } .page-content { @@ -82,7 +86,7 @@ $app-header-height: 56px; $breadcrumb-opacity: .7; $breadcrumb-hover-opacity: 1; $breadcrumb-padding: 3px; - $font-size: 20px; + $font-size: 18px; align-items: center; border-bottom: 1px solid rgba(0, 0, 0, .1); diff --git a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts index b7da02c398..63470698a2 100644 --- a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts +++ b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts @@ -11,13 +11,13 @@ import { CloseSideNav, DisableMobileNav, EnableMobileNav } from '../../../../../ import { GetCurrentUsersRelations } from '../../../../../store/src/actions/permissions.actions'; import { DashboardOnlyAppState } from '../../../../../store/src/app-state'; import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; -import { DashboardState } from '../../../../../store/src/reducers/dashboard-reducer'; import { selectDashboardState } from '../../../../../store/src/selectors/dashboard.selectors'; import { stratosEntityCatalog } from '../../../../../store/src/stratos-entity-catalog'; +import { DashboardState } from '../../../../../store/src/types/dashboard.types'; import { CustomizationService } from '../../../core/customizations.types'; import { EndpointsService } from '../../../core/endpoints.service'; import { IHeaderBreadcrumbLink } from '../../../shared/components/page-header/page-header.types'; -import { SidePanelService } from '../../../shared/services/side-panel.service'; +import { SidePanelMode, SidePanelService } from '../../../shared/services/side-panel.service'; import { TabNavService } from '../../../tab-nav.service'; import { IPageSideNavTab } from '../page-side-nav/page-side-nav.component'; import { PageHeaderService } from './../../../core/page-header-service/page-header.service'; @@ -36,8 +36,8 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit public isMobile$: Observable; public sideNavMode$: Observable; public sideNavMode: string; - public mainNavState$: Observable<{ mode: string; opened: boolean; iconMode: boolean; }>; - public rightNavState$: Observable<{ opened: boolean, component?: object, props?: object; }>; + public mainNavState$: Observable<{ mode: string; opened: boolean; iconMode: boolean, }>; + public rightNavState$: Observable<{ opened: boolean, component?: object, props?: object, }>; private dashboardState$: Observable; public noMargin$: Observable; private closeSub: Subscription; @@ -53,6 +53,9 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit @ViewChild('content') public content; + // Slide-in side panel mode + sidePanelMode: SidePanelMode = SidePanelMode.Modal; + constructor( public pageHeaderService: PageHeaderService, private store: Store, diff --git a/src/frontend/packages/core/src/features/dashboard/dashboard.module.ts b/src/frontend/packages/core/src/features/dashboard/dashboard.module.ts index 6df87a993c..712f6f4b18 100644 --- a/src/frontend/packages/core/src/features/dashboard/dashboard.module.ts +++ b/src/frontend/packages/core/src/features/dashboard/dashboard.module.ts @@ -1,16 +1,18 @@ +import { ScrollingModule } from '@angular/cdk/scrolling'; import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; -import { DashboardBaseComponent } from './dashboard-base/dashboard-base.component'; -import { SideNavComponent } from './side-nav/side-nav.component'; import { MetricsModule } from '../metrics/metrics.module'; +import { DashboardBaseComponent } from './dashboard-base/dashboard-base.component'; import { PageSideNavComponent } from './page-side-nav/page-side-nav.component'; +import { SideNavComponent } from './side-nav/side-nav.component'; @NgModule({ imports: [ CoreModule, + ScrollingModule, SharedModule, MetricsModule, ], diff --git a/src/frontend/packages/core/src/features/dashboard/side-nav/side-nav.component.html b/src/frontend/packages/core/src/features/dashboard/side-nav/side-nav.component.html index 15ec64efb0..801baccaa2 100644 --- a/src/frontend/packages/core/src/features/dashboard/side-nav/side-nav.component.html +++ b/src/frontend/packages/core/src/features/dashboard/side-nav/side-nav.component.html @@ -1,6 +1,6 @@

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%0Dv&D8AHTsak19G~OBLPc|B<_P}| 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 literal 0 HcmV?d00001 diff --git a/electron/index.js b/electron/index.js new file mode 100644 index 0000000000..61989102d5 --- /dev/null +++ b/electron/index.js @@ -0,0 +1,271 @@ +const { + app, + BrowserWindow, + Menu, + shell, + dialog, + nativeTheme, + Notification, + ipcMain +} = require('electron') +const url = require("url"); +const path = require("path"); +const https = require('https'); +const chokidar = require('chokidar'); + +const ElectronStore = require('./electron-store.js'); + +const findFreePort = require("./freeport"); +const { + exec, + spawn +} = require('child_process'); +const contextMenu = require('electron-context-menu'); +const mainMenu = require('./menu'); +const homeDir = require('os').homedir(); +const fs = require('fs-extra'); +const windowStateKeeper = require('electron-window-state'); +// const { +// escapeRegExp +// } = require('lodash'); + +// Auto-update - won't work without signed developer account +// require('update-electron-app')({ +// repo: 'nwmac/stratos-desktop', +// updateInterval: '5 minutes', +// //logger: require('electron-log') +// }) + +//const LOG_FILE = '/Users/nwm/stratos.log'; +const icon = path.join(__dirname, '/icon.png'); + +const ELECTRON_NOTIFICATION = 'ELECTRON_NOTIFICATION'; +// See node_modules/electron/electron.d.ts NotificationConstructorOptions +const standardNotificationSettings = { + title: 'Stratos', + silent: false, + icon, +}; + +let mainWindow; +let jetstream; + +const lastLocation = 'lastLocation'; +const store = new ElectronStore({ + configName: 'settings', + defaults: { + [lastLocation]: '' + } +}); + +function addContextMenu(mainWindow) { + let rightClickPosition = null + + const menu = new Menu() + const menuItem = new MenuItem({ + label: 'Inspect Element', + click: () => { + remote.getCurrentWindow().inspectElement(rightClickPosition.x, rightClickPosition.y) + } + }) + menu.append(menuItem) + + mainWindow.addEventListener('contextmenu', (e) => { + e.preventDefault() + rightClickPosition = { + x: e.x, + y: e.y + } + menu.popup(remote.getCurrentWindow()) + }, false); +} + +function createWindow() { + + // fs.writeFileSync(LOG_FILE, 'STRATOS\n'); + // fs.appendFileSync(LOG_FILE, __dirname); + + findFreePort(30000, 40000, '127.0.0.1', function (err, port) { + let url = `127.0.0.1:${port}`; + const prog = path.join(__dirname, `./jetstream`); + jetstream = spawn(prog, [], { + env: getEnvironment(url), + cwd: __dirname, + stdio: 'inherit' + }); + + waitForBackend(`https://${url}`, () => { + doCreateWindow(url); + }, 0); + }); +} + +function doCreateWindow(url) { + + let mainWindowState = windowStateKeeper({ + defaultWidth: 1024, + defaultHeight: 768 + }); + + mainWindow = new BrowserWindow({ + x: mainWindowState.x, + y: mainWindowState.y, + width: mainWindowState.width, + height: mainWindowState.height, + // title: 'Stratos', // Set automatically by html title + webPreferences: { + nodeIntegration: true + }, + icon, + }); + // Remember last position and size + mainWindowState.manage(mainWindow); + mainWindow.on('close', function () { + savePath(mainWindow.webContents.getURL()) + }); + mainWindow.on('closed', function () { + mainWindow = null; + jetstream.kill(); + }); + + // Context menu + contextMenu({ + window: mainWindow, + // Hide the 'inspect element' menu item + // showInspectElement: false + }); + + // Load the UI from the dev version beign served by `ng serve` + if (isDev()) { + url = '127.0.0.1:4200' + } + url = `https://${url}` + + const menu = Menu.buildFromTemplate(mainMenu(mainWindow, url)); + Menu.setApplicationMenu(menu) + + mainWindow.loadURL(addPath(url)); + + ipcMain.on(ELECTRON_NOTIFICATION, (event, args) => { + new Notification({ + ...standardNotificationSettings, + title: 'Stratos', + body: args.message, + }).show() + }) + + // Open the DevTools. + //mainWindow.webContents.openDevTools({mode:'undocked'}); + + // Watch for changed in ant of the local configuration files + // We will reload endpoints when these change + const watcher = chokidar.watch([ + getCFConfigFile(), + getKubeConfigFile(), + getHelmRepoFolder() + ]); + watcher.on('all', (action, filePath) => { + mainWindow.webContents.send('endpointsChanged', action, filePath); + }); +} + +app.on('ready', createWindow) + +app.on('window-all-closed', function () { + //if (process.platform !== 'darwin') app.quit() + // Even on MacOS, quit when the last window is closed + app.quit(); +}) + +app.on('activate', function () { + if (mainWindow === null) createWindow() +}) + +app.on('certificate-error', (event, webContents, url, error, certificate, callback) => { + + if (url.indexOf('https://127.0.0.1') === 0 || url.indexOf('wss://127.0.0.1') === 0) { + // Verification logic. + event.preventDefault() + callback(true) + } else { + callback(false); + } +}); + +function addPath(url) { + return url + store.get(lastLocation); +} + +function savePath(url) { + const oUrl = new URL(url); + store.set(lastLocation, oUrl.pathname); +} + +function getConfigFolder() { + const configFolder = store.path; + fs.ensureDirSync(configFolder); + return configFolder; +} + +function getEnvironment(url) { + return { + 'CONSOLE_PROXY_TLS_ADDRESS': url, + 'SQLITE_KEEP_DB': 'true', + 'SQLITE_DB_DIR': getConfigFolder(), + //'LOG_LEVEL': 'DEBUG', + 'SESSION_STORE_EXPIRY': 5000, + 'AUTH_ENDPOINT_TYPE': 'none' + }; +} + +function isDev() { + const args = process.argv + return args.length > 1 && args[2] === 'dev'; +} + +function waitForBackend(url, done, retry) { + const opts = { + rejectUnauthorized: false, + } + const ping = `${url}/pp/v1/version`; + https.get(ping, opts, (resp) => { + if (resp.statusCode === 200) { + done(); + } else { + jetstreamDidNotStart(url, done, retry + 1) + } + }).on('error', (err) => { + jetstreamDidNotStart(url, done, retry + 1) + }); + +} + +function jetstreamDidNotStart(url, done, retry) { + if (retry === 100) { + dialog.showMessageBoxSync({ + type: 'error', + title: 'Failed to start Stratos backend', + message: 'The Stratos backend could not be reached' + }); + jetstream.kill(); + app.quit(); + } else { + setTimeout(() => waitForBackend(url, done, retry), 50); + } +} + +function getHelmRepoFolder() { + var isMac = process.platform === "darwin"; + if (isMac) { + return path.join(homeDir, 'Library', 'Preferences', 'helm'); + } + return path.join(homeDir, '.config', 'helm'); +} + +function getCFConfigFile() { + return path.join(homeDir, '.cf', 'config.json'); +} + +function getKubeConfigFile() { + return process.env.KUBECONFIG || path.join(homeDir, '.kube', 'config'); +} diff --git a/electron/logo.png b/electron/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..03d4990b89312c6d14d0efbcd5810d81678e45d7 GIT binary patch literal 93628 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