diff --git a/.gitignore b/.gitignore index cf462ce1fd..21c2a5101c 100644 --- a/.gitignore +++ b/.gitignore @@ -86,7 +86,7 @@ src/backend/*/vendor/ .v8flags* *.bak -./secrets.yaml +/secrets.yaml build/dev_config.json e2e-reports/ .stratos-git-metadata.json diff --git a/angular.json b/angular.json index 9d29bc4da8..75d6a32748 100644 --- a/angular.json +++ b/angular.json @@ -11,6 +11,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { + "aot": true, "preserveSymlinks": true, "outputPath": "dist", "index": "src/frontend/packages/core/src/index.html", @@ -35,6 +36,10 @@ }, "configurations": { "production": { + "budgets": [{ + "type": "anyComponentStyle", + "maximumWarning": "6kb" + }], "optimization": true, "outputHashing": "all", "sourceMap": false, @@ -44,12 +49,10 @@ "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, - "fileReplacements": [ - { - "replace": "src/frontend/packages/core/src/environments/environment.ts", - "with": "src/frontend/packages/core/src/environments/environment.prod.ts" - } - ] + "fileReplacements": [{ + "replace": "src/frontend/packages/core/src/environments/environment.ts", + "with": "src/frontend/packages/core/src/environments/environment.prod.ts" + }] } } }, @@ -101,6 +104,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { + "aot": true, "preserveSymlinks": true, "outputPath": "dist/core", "index": "src/frontend/packages/core/src/index.html", @@ -124,12 +128,14 @@ }, "configurations": { "production": { - "fileReplacements": [ - { - "replace": "src/frontend/packages/core/src/environments/environment.ts", - "with": "src/frontend/packages/core/src/environments/environment.prod.ts" - } - ], + "budgets": [{ + "type": "anyComponentStyle", + "maximumWarning": "6kb" + }], + "fileReplacements": [{ + "replace": "src/frontend/packages/core/src/environments/environment.ts", + "with": "src/frontend/packages/core/src/environments/environment.prod.ts" + }], "optimization": true, "outputHashing": "all", "sourceMap": false, @@ -215,6 +221,11 @@ "options": { "tsConfig": "src/frontend/packages/store/tsconfig.lib.json", "project": "src/frontend/packages/store/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "src/frontend/packages/store/tsconfig.lib.prod.json" + } } }, "test": { @@ -253,6 +264,11 @@ "options": { "tsConfig": "src/frontend/packages/cloud-foundry/tsconfig.lib.json", "project": "src/frontend/packages/cloud-foundry/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "src/frontend/packages/cloud-foundry/tsconfig.lib.prod.json" + } } }, "test": { @@ -291,6 +307,11 @@ "options": { "tsConfig": "src/frontend/packages/cf-autoscaler/tsconfig.lib.json", "project": "src/frontend/packages/cf-autoscaler/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "src/frontend/packages/cf-autoscaler/tsconfig.lib.prod.json" + } } }, "test": { @@ -323,13 +344,13 @@ "schematics": { "@schematics/angular:component": { "prefix": "app", - "styleext": "scss" + "style": "scss" }, "@schematics/angular:directive": { "prefix": "app" } }, "cli": { - "defaultCollection": "@nrwl/angular" + "_defaultCollection": "@nrwl/angular" } -} \ No newline at end of file +} diff --git a/build/combine-coverage.js b/build/combine-coverage.js deleted file mode 100644 index e7cb729cbc..0000000000 --- a/build/combine-coverage.js +++ /dev/null @@ -1,10 +0,0 @@ -const createReporter = require('istanbul-api').createReporter; -const istanbulCoverage = require('istanbul-lib-coverage'); -const coverage = require('../coverage/coverage-final.json'); - -const map = istanbulCoverage.createCoverageMap(); -Object.keys(coverage).forEach(filename => map.addFileCoverage(coverage[filename])); - -const reporter = createReporter(); -reporter.addAll(['html', 'lcovonly', 'json']); -reporter.write(map); diff --git a/build/karma.conf.creator.js b/build/karma.conf.creator.js index f530d5e903..d516e0fceb 100644 --- a/build/karma.conf.creator.js +++ b/build/karma.conf.creator.js @@ -27,7 +27,13 @@ module.exports = function (project) { coverageIstanbulReporter: { dir: path.join(repoRoot, 'coverage', project), reports: ['html', 'lcovonly', 'json'], - fixWebpackSourcePaths: true + fixWebpackSourcePaths: true, + 'report-config': { + json: { + // Collate all coverage-final files into a single dir for nyc to combine (it can't pick them out from `coverage`) + file: path.join('..', 'nyc', project + '-coverage-final.json') + } + }, }, reporters: ['spec', 'kjhtml', 'stratos'], specReporter: { diff --git a/build/karma.test.reporter.js b/build/karma.test.reporter.js index edf859c2f7..cdb20c8b9d 100644 --- a/build/karma.test.reporter.js +++ b/build/karma.test.reporter.js @@ -1,4 +1,3 @@ - (function () { 'use strict'; @@ -75,7 +74,7 @@ fs.unlinkSync(this.summaryFile); } - const all = this.runningTotals; + const all = this.runningTotals; this.writeSummaryFile(`${this.bold}${this.cyan}================================================================================${this.reset}`); this.writeSummaryFile(`${this.bold}${this.cyan}Test Summary${this.reset}`); @@ -106,47 +105,47 @@ try { - this.writeFile(`${this.bold}${this.cyan}Test results for package ${this.bluebg} ${process.env.NG_TEST_SUITE} ${this.reset}`); - this.writeFile(`Total : ${this.bold}${this.cyan}${this.total}${this.reset}`) - this.writeFile(`Passed : ${this.bold}${this.cyan}${passed}${this.reset}`) - this.writeFile(`Failed : ${this.bold}${this.red}${this.failed.length}${this.reset}`) - this.writeFile(`Skipped : ${this.bold}${this.yellow}${this.skipped}${this.reset}`) - - if (this.failed.length === 0) { - fs.appendFileSync(this.file, 'All tests passed\n') - } else { - this.writeFile('Test failures:'); - this.failed.forEach(f => { - this.writeFile(`${this.red}${this.bold} - ${f.fullName}${this.reset}`); - const logs = f.log || []; - logs.forEach(l => fs.appendFileSync(this.file, `${this.grey} ${l}${this.reset}`)); - // Add empty line - this.writeFile(''); - }); - } - - // Update running totals JSON - this.runningTotals.total += this.total; - this.runningTotals.passed += passed; - this.runningTotals.failed += this.failed.length; - this.runningTotals.skipped += this.skipped; - fs.writeFileSync(this.jsonFile, JSON.stringify(this.runningTotals)); - - this.generateSummary(); - - // Write exit code - let newExitCode = this.exitCode; - if (result.exitCode > 0) { - newExitCode = result.exitCode - } - - fs.writeFileSync(this.exitCodeFile, newExitCode.toString()); - - // Dump the summary for this test suite - var contents = fs.readFileSync(this.file, 'utf8'); - console.log(contents); - - } catch(e) { + this.writeFile(`${this.bold}${this.cyan}Test results for package ${this.bluebg} ${process.env.NG_TEST_SUITE} ${this.reset}`); + this.writeFile(`Total : ${this.bold}${this.cyan}${this.total}${this.reset}`) + this.writeFile(`Passed : ${this.bold}${this.cyan}${passed}${this.reset}`) + this.writeFile(`Failed : ${this.bold}${this.red}${this.failed.length}${this.reset}`) + this.writeFile(`Skipped : ${this.bold}${this.yellow}${this.skipped}${this.reset}`) + + if (this.failed.length === 0) { + fs.appendFileSync(this.file, 'All tests passed\n') + } else { + this.writeFile('Test failures:'); + this.failed.forEach(f => { + this.writeFile(`${this.red}${this.bold} - ${f.fullName}${this.reset}`); + const logs = f.log || []; + logs.forEach(l => fs.appendFileSync(this.file, `${this.grey} ${l}${this.reset}`)); + // Add empty line + this.writeFile(''); + }); + } + + // Update running totals JSON + this.runningTotals.total += this.total; + this.runningTotals.passed += passed; + this.runningTotals.failed += this.failed.length; + this.runningTotals.skipped += this.skipped; + fs.writeFileSync(this.jsonFile, JSON.stringify(this.runningTotals)); + + this.generateSummary(); + + // Write exit code + let newExitCode = this.exitCode; + if (result.exitCode > 0) { + newExitCode = result.exitCode + } + + fs.writeFileSync(this.exitCodeFile, newExitCode.toString()); + + // Dump the summary for this test suite + var contents = fs.readFileSync(this.file, 'utf8'); + console.log(contents); + + } catch (e) { console.log('ERROR while reporting test result'); console.log(e); } diff --git a/custom-src/frontend/app/custom/custom-routing.module.ts b/custom-src/frontend/app/custom/custom-routing.module.ts index 3a69e8d96e..59ddebd3b8 100644 --- a/custom-src/frontend/app/custom/custom-routing.module.ts +++ b/custom-src/frontend/app/custom/custom-routing.module.ts @@ -21,7 +21,7 @@ const customRoutes: Routes = [ }, { path: 'kubernetes', - loadChildren: './kubernetes/kubernetes.module#KubernetesModule', + loadChildren: () => import('./kubernetes/kubernetes.module').then(m => m.KubernetesModule), data: { stratosNavigation: { text: 'Kubernetes', @@ -34,7 +34,7 @@ const customRoutes: Routes = [ }, { path: 'monocular', - loadChildren: './helm/helm.module#HelmModule', + loadChildren: () => import('./helm/helm.module').then(m => m.HelmModule), data: { reuseRoute: true, stratosNavigation: { diff --git a/custom-src/frontend/app/custom/helm/create-release/create-release.component.ts b/custom-src/frontend/app/custom/helm/create-release/create-release.component.ts index 87e87edc6b..709dfdc928 100644 --- a/custom-src/frontend/app/custom/helm/create-release/create-release.component.ts +++ b/custom-src/frontend/app/custom/helm/create-release/create-release.component.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MatTextareaAutosize } from '@angular/material'; +import { MatTextareaAutosize } from '@angular/material/input'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { PaginationMonitorFactory } from 'frontend/packages/store/src/monitors/pagination-monitor.factory'; @@ -10,7 +10,7 @@ import { BehaviorSubject, combineLatest, Observable, of, Subscription } from 'rx import { distinctUntilChanged, filter, first, map, pairwise, startWith, switchMap } from 'rxjs/operators'; import { AppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { EndpointsService } from '../../../core/endpoints.service'; import { safeUnsubscribe } from '../../../core/utils.service'; import { ConfirmationDialogConfig } from '../../../shared/components/confirmation-dialog.config'; @@ -64,7 +64,8 @@ export class CreateReleaseComponent implements OnInit, OnDestroy { private store: Store, private httpClient: HttpClient, private confirmDialog: ConfirmationDialogService, - private pmf: PaginationMonitorFactory + private pmf: PaginationMonitorFactory, + private emf: EntityMonitorFactory ) { const chart = this.route.snapshot.params; this.cancelUrl = `/monocular/charts/${chart.repo}/${chart.chartName}/${chart.version}`; @@ -238,9 +239,7 @@ export class CreateReleaseComponent implements OnInit, OnDestroy { this.details.controls.endpoint.value); this.store.dispatch(action); - const namespaceEntityConfig = entityCatalog.getEntity(action); - const monitor = namespaceEntityConfig.getEntityMonitor(this.store, action.guid); - return monitor.entityRequest$.pipe( + return this.emf.create(action.guid, action).entityRequest$.pipe( pairwise(), filter(([oldVal, newVal]) => oldVal.creating && !newVal.creating), map(([, newVal]) => newVal), @@ -271,10 +270,8 @@ export class CreateReleaseComponent implements OnInit, OnDestroy { const action = new HelmInstall(values); this.store.dispatch(action); - const releaseEntityConfig = entityCatalog.getEntity(action); - // Wait for result of request - return releaseEntityConfig.getEntityMonitor(this.store, action.guid).entityRequest$.pipe( + return this.emf.create(action.guid, action).entityRequest$.pipe( filter(state => !!state), pairwise(), filter(([oldVal, newVal]) => (oldVal.creating && !newVal.creating)), diff --git a/custom-src/frontend/app/custom/helm/helm-entity-generator.ts b/custom-src/frontend/app/custom/helm/helm-entity-generator.ts index aef2cffc53..0fb65457a6 100644 --- a/custom-src/frontend/app/custom/helm/helm-entity-generator.ts +++ b/custom-src/frontend/app/custom/helm/helm-entity-generator.ts @@ -2,7 +2,7 @@ import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from '../../../../store/src/entity-catalog/entity-catalog-entity'; +} from '../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { StratosEndpointExtensionDefinition } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { IFavoriteMetadata } from '../../../../store/src/types/user-favorites.types'; import { diff --git a/custom-src/frontend/app/custom/helm/helm-testing.module.ts b/custom-src/frontend/app/custom/helm/helm-testing.module.ts index 62765f8b0d..9ee747eaf0 100644 --- a/custom-src/frontend/app/custom/helm/helm-testing.module.ts +++ b/custom-src/frontend/app/custom/helm/helm-testing.module.ts @@ -5,7 +5,7 @@ import { ActivatedRoute } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { createBasicStoreModule } from '../../../../store/testing/public-api'; import { generateStratosEntities } from '../../base-entity-types'; import { CoreModule } from '../../core/core.module'; diff --git a/custom-src/frontend/app/custom/helm/list-types/monocular-repository-list-config.service.ts b/custom-src/frontend/app/custom/helm/list-types/monocular-repository-list-config.service.ts index b3d343ef8c..84b0b50c70 100644 --- a/custom-src/frontend/app/custom/helm/list-types/monocular-repository-list-config.service.ts +++ b/custom-src/frontend/app/custom/helm/list-types/monocular-repository-list-config.service.ts @@ -1,10 +1,10 @@ import { HttpClient } from '@angular/common/http'; import { Injectable, NgZone } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { UnregisterEndpoint } from 'frontend/packages/store/src/actions/endpoint.actions'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from 'frontend/packages/store/src/helpers/entity-factory'; import { selectDeletionInfo } from 'frontend/packages/store/src/selectors/api.selectors'; import { of as observableOf } from 'rxjs'; diff --git a/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details-usage/chart-details-usage.component.ts b/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details-usage/chart-details-usage.component.ts index 87321f55e1..c8c3aa91cf 100644 --- a/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details-usage/chart-details-usage.component.ts +++ b/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details-usage/chart-details-usage.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; -import { MatIconRegistry, MatSnackBar } from '@angular/material'; +import { MatIconRegistry } from '@angular/material/icon'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { DomSanitizer } from '@angular/platform-browser'; import { EndpointsService } from '../../../../../core/endpoints.service'; diff --git a/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details.component.spec.ts b/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details.component.spec.ts index 6b6940f420..d670ba09c3 100644 --- a/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details.component.spec.ts +++ b/custom-src/frontend/app/custom/helm/monocular/chart-details/chart-details.component.spec.ts @@ -1,5 +1,3 @@ -import 'hammerjs'; - import { HttpClient, HttpClientModule } from '@angular/common/http'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserModule } from '@angular/platform-browser'; @@ -24,60 +22,6 @@ import { ChartDetailsUsageComponent } from './chart-details-usage/chart-details- import { ChartDetailsVersionsComponent } from './chart-details-versions/chart-details-versions.component'; import { ChartDetailsComponent } from './chart-details.component'; -/* tslint:disable:no-unused-variable */ -// import { Angulartics2Module } from 'angulartics2'; -// import { ClipboardModule } from 'ngx-clipboard'; - -// import { HeaderBarComponent } from '../header-bar/header-bar.component'; -// import { TruncatePipe } from '../shared/pipes/truncate.pipe'; -// import { SeoService } from '../shared/services/seo.service'; -// Shared -// Components -// Stub -const mockData = { - data: { - attributes: { - description: 'Testing the chart', - home: 'helm.sh', - keywords: ['artifactory'], - maintainers: [ - { - email: 'test@example.com', - name: 'Test' - } - ], - name: 'test', - repo: 'incubator', - sources: ['https://github.com/'] - }, - id: 'incubator/test', - relationships: { - latestChartVersion: { - data: { - created: '2017-02-13T04:33:57.218083521Z', - digest: - 'eba0c51d4bc5b88d84f83d8b2ba0c5e5a3aad8bc19875598198bdbb0b675f683', - icons: [ - { - name: '160x160-fit', - path: '/assets/incubator/test/4.16.0/logo-160x160-fit.png' - } - ], - readme: '/assets/incubator/test/4.16.0/README.md', - urls: [ - 'https://kubernetes-charts-incubator.storage.googleapis.com/test-4.16.0.tgz' - ], - version: '4.16.0' - }, - links: { - self: '/v1/charts/incubator/test/versions/4.16.0' - } - } - }, - type: 'chart' - } -}; - describe('ChartDetailsComponent', () => { let component: ChartDetailsComponent; let fixture: ComponentFixture; @@ -86,9 +30,7 @@ describe('ChartDetailsComponent', () => { async(() => { TestBed.configureTestingModule({ imports: [ - // ClipboardModule, BrowserModule, - // Angulartics2Module, RouterTestingModule, HttpClientModule, ...BaseTestModulesNoShared @@ -101,9 +43,7 @@ describe('ChartDetailsComponent', () => { ChartDetailsUsageComponent, LoaderComponent, PanelComponent, - // HeaderBarComponent, ChartItemComponent, - // TruncatePipe, ListItemComponent, EntitySummaryTitleComponent ], @@ -111,7 +51,6 @@ describe('ChartDetailsComponent', () => { HttpClient, { provide: ChartsService, useValue: new MockChartService() }, { provide: ConfigService, useValue: { appName: 'appName' } }, - // { provide: SeoService }, { provide: MenuService }, PaginationMonitorFactory, ] diff --git a/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.spec.ts b/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.spec.ts index fda675c9e7..d634d2c8de 100644 --- a/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.spec.ts +++ b/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.spec.ts @@ -2,7 +2,9 @@ import { HttpClient } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { of } from 'rxjs'; import { createBasicStoreModule } from '../../../../../../store/testing/public-api'; import { LoggerService } from '../../../../core/logger.service'; @@ -17,14 +19,13 @@ import { MenuService } from '../shared/services/menu.service'; import { ReposService } from '../shared/services/repos.service'; import { ChartsComponent } from './charts.component'; -// import { HeaderBarComponent } from '../header-bar/header-bar.component'; -// import { SeoService } from '../shared/services/seo.service'; -describe('Component: Charts', () => { +describe('ChartsComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ HttpClientTestingModule, - createBasicStoreModule() + createBasicStoreModule(), + RouterTestingModule ], declarations: [ ChartsComponent, @@ -32,16 +33,23 @@ describe('Component: Charts', () => { ChartItemComponent, LoaderComponent, PanelComponent, - // HeaderBarComponent ], providers: [ HttpClient, ConfigService, MenuService, { provide: ChartsService, useValue: new MockChartService() }, - // { provide: SeoService }, - { provide: ActivatedRoute }, - { provide: Router }, + { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: {}, + queryParams: {} + }, + queryParams: of({}), + params: of({}) + } + }, ReposService, LoggerService ], diff --git a/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.ts b/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.ts index 711ee0d5ab..aaffa19cf0 100644 --- a/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.ts +++ b/custom-src/frontend/app/custom/helm/monocular/charts/charts.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { MatIconRegistry } from '@angular/material'; +import { MatIconRegistry } from '@angular/material/icon'; import { DomSanitizer } from '@angular/platform-browser'; import { ActivatedRoute, Params, Router } from '@angular/router'; diff --git a/custom-src/frontend/app/custom/helm/store/helm.effects.ts b/custom-src/frontend/app/custom/helm/store/helm.effects.ts index 4d3d1534dd..e79232c5d9 100644 --- a/custom-src/frontend/app/custom/helm/store/helm.effects.ts +++ b/custom-src/frontend/app/custom/helm/store/helm.effects.ts @@ -2,9 +2,10 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Action, Store } from '@ngrx/store'; +import { GET_ENDPOINTS_SUCCESS, GetAllEndpointsSuccess } from 'frontend/packages/store/src/actions/endpoint.actions'; import { ClearPaginationOfType } from 'frontend/packages/store/src/actions/pagination.actions'; import { AppState } from 'frontend/packages/store/src/app-state'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog'; import { ApiRequestTypes } from 'frontend/packages/store/src/reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from 'frontend/packages/store/src/types/api.types'; import { @@ -13,11 +14,12 @@ import { WrapperRequestActionFailed, WrapperRequestActionSuccess, } from 'frontend/packages/store/src/types/request.types'; -import { Observable, of } from 'rxjs'; +import { Observable } from 'rxjs'; import { catchError, flatMap, mergeMap } from 'rxjs/operators'; import { environment } from '../../../environments/environment'; import { isJetstreamError } from '../../../jetstream.helpers'; +import { HELM_ENDPOINT_TYPE } from '../helm-entity-factory'; import { GET_HELM_VERSIONS, GET_MONOCULAR_CHARTS, @@ -27,8 +29,6 @@ import { HelmInstall, } from './helm.actions'; import { HelmVersion } from './helm.types'; -import { GetAllEndpointsSuccess, GET_ENDPOINTS_SUCCESS } from 'frontend/packages/store/src/actions/endpoint.actions'; -import { HELM_ENDPOINT_TYPE } from '../helm-entity-factory'; @Injectable() export class HelmEffects { diff --git a/custom-src/frontend/app/custom/kubernetes/kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component.ts b/custom-src/frontend/app/custom/kubernetes/kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component.ts index f2e26cfaf7..d7ec27b338 100644 --- a/custom-src/frontend/app/custom/kubernetes/kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component.ts +++ b/custom-src/frontend/app/custom/kubernetes/kubernetes-dashboard/kubedash-configuration/kubedash-configuration.component.ts @@ -1,6 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Component, OnDestroy } from '@angular/core'; -import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material'; +import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar'; import { ActivatedRoute } from '@angular/router'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map } from 'rxjs/operators'; diff --git a/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-factory.ts b/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-factory.ts index 787e1a6024..1e0aed9df9 100644 --- a/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-factory.ts +++ b/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-factory.ts @@ -1,8 +1,8 @@ import { Schema, schema } from 'normalizr'; -import { metricEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { getAPIResourceGuid } from '../../../../cloud-foundry/src/store/selectors/api.selectors'; import { EntitySchema } from '../../../../store/src/helpers/entity-schema'; +import { metricEntityType } from '../../base-entity-schemas'; import { getKubeAPIResourceGuid } from './store/kube.selectors'; import { KubernetesApp } from './store/kube.types'; diff --git a/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-generator.ts b/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-generator.ts index cd4b43f25a..8155fd83ce 100644 --- a/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-generator.ts +++ b/custom-src/frontend/app/custom/kubernetes/kubernetes-entity-generator.ts @@ -1,13 +1,13 @@ import { Validators } from '@angular/forms'; -import { metricEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from '../../../../store/src/entity-catalog/entity-catalog-entity'; +} from '../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { StratosEndpointExtensionDefinition } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { IFavoriteMetadata } from '../../../../store/src/types/user-favorites.types'; +import { metricEntityType } from '../../base-entity-schemas'; import { EndpointAuthTypeConfig, EndpointType } from '../../core/extension/extension-types'; import { KubernetesAWSAuthFormComponent } from './auth-forms/kubernetes-aws-auth-form/kubernetes-aws-auth-form.component'; import { diff --git a/custom-src/frontend/app/custom/kubernetes/kubernetes.testing.module.ts b/custom-src/frontend/app/custom/kubernetes/kubernetes.testing.module.ts index 9aa2016dfd..c87f6368fc 100644 --- a/custom-src/frontend/app/custom/kubernetes/kubernetes.testing.module.ts +++ b/custom-src/frontend/app/custom/kubernetes/kubernetes.testing.module.ts @@ -4,7 +4,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { createBasicStoreModule } from '../../../../store/testing/public-api'; import { generateStratosEntities } from '../../base-entity-types'; import { CoreModule } from '../../core/core.module'; @@ -38,22 +38,6 @@ export const KubernetesBaseTestModules = [ RouterTestingModule, CoreModule, createBasicStoreModule(), - // createBasicStoreModule({ - // auth: { - // error: false, - // errorResponse: {}, - // loggedIn: false, - // loggingIn: false, - // sessionData: { - // config: {}, - // plugins: null, - // sessionExpiresOn: 0, - // valid: false, - // }, - // user: null, - // verifying: false, - // }, - // }), NoopAnimationsModule, HttpClientModule, SharedModule, diff --git a/custom-src/frontend/app/custom/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts b/custom-src/frontend/app/custom/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts index ecc31b5654..f83718f337 100644 --- a/custom-src/frontend/app/custom/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts +++ b/custom-src/frontend/app/custom/kubernetes/list-types/kubernetes-pods/kubernetes-pod-containers/kubernetes-pod-containers.component.ts @@ -6,7 +6,7 @@ import { of } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { AppState } from '../../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectEntity } from '../../../../../../../store/src/selectors/api.selectors'; import { BooleanIndicatorType } from '../../../../../shared/components/boolean-indicator/boolean-indicator.component'; import { ITableListDataSource } from '../../../../../shared/components/list/data-sources-controllers/list-data-source-types'; diff --git a/custom-src/frontend/app/custom/kubernetes/store/kubernetes.actions.ts b/custom-src/frontend/app/custom/kubernetes/store/kubernetes.actions.ts index 6d1d44c4ef..e678c983b8 100644 --- a/custom-src/frontend/app/custom/kubernetes/store/kubernetes.actions.ts +++ b/custom-src/frontend/app/custom/kubernetes/store/kubernetes.actions.ts @@ -1,4 +1,4 @@ -import { SortDirection } from '@angular/material'; +import { SortDirection } from '@angular/material/sort'; import { getActions } from 'frontend/packages/store/src/actions/action.helper'; import { ApiRequestTypes } from 'frontend/packages/store/src/reducers/api-request-reducer/request-helpers'; diff --git a/custom-src/frontend/app/custom/kubernetes/store/kubernetes.effects.ts b/custom-src/frontend/app/custom/kubernetes/store/kubernetes.effects.ts index d5d36df44d..c55b3cca8a 100644 --- a/custom-src/frontend/app/custom/kubernetes/store/kubernetes.effects.ts +++ b/custom-src/frontend/app/custom/kubernetes/store/kubernetes.effects.ts @@ -9,7 +9,7 @@ import { of } from 'rxjs'; import { catchError, first, flatMap, map, mergeMap, switchMap } from 'rxjs/operators'; import { AppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { NormalizedResponse } from '../../../../../store/src/types/api.types'; import { StartRequestAction, diff --git a/custom-src/frontend/app/custom/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts b/custom-src/frontend/app/custom/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts index a7c14df6ce..5f7d4cdd5d 100644 --- a/custom-src/frontend/app/custom/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts +++ b/custom-src/frontend/app/custom/kubernetes/tabs/kubernetes-summary-tab/kubernetes-summary.component.ts @@ -1,12 +1,13 @@ import { HttpClient } from '@angular/common/http'; import { Component, NgZone, OnDestroy, OnInit } from '@angular/core'; import { SafeResourceUrl } from '@angular/platform-browser'; +import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { combineLatest, interval, Observable, Subscription } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { PaginatedAction } from '../../../../../../store/src/types/pagination.types'; @@ -17,7 +18,6 @@ import { } from '../../../../shared/components/simple-usage-chart/simple-usage-chart.types'; import { KubernetesEndpointService } from '../../services/kubernetes-endpoint.service'; import { GetKubernetesNamespaces, GetKubernetesNodes, GetKubernetesPods } from '../../store/kubernetes.actions'; -import { Router } from '@angular/router'; interface IValueLabels { usedLabel?: string; diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts b/custom-src/frontend/app/custom/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts index c41019c89a..6132e3fc47 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/list-types/kube-namespaces-filter-config.service.ts @@ -3,10 +3,7 @@ import { Store } from '@ngrx/store'; import { safeUnsubscribe } from 'frontend/packages/core/src/core/utils.service'; import { AppState } from 'frontend/packages/store/src/app-state'; import { PaginationMonitorFactory } from 'frontend/packages/store/src/monitors/pagination-monitor.factory'; -import { - getCurrentPageRequestInfo, - getPaginationObservables, -} from 'frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getPaginationObservables } from 'frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { connectedEndpointsOfTypesSelector } from 'frontend/packages/store/src/selectors/endpoint.selectors'; import { EndpointModel } from 'frontend/packages/store/src/types/endpoint.types'; import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; @@ -22,6 +19,7 @@ import { withLatestFrom, } from 'rxjs/operators'; +import { getCurrentPageRequestInfo } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { KUBERNETES_ENDPOINT_TYPE, kubernetesEntityFactory } from '../../kubernetes-entity-factory'; import { KubernetesNamespace } from '../../store/kube.types'; import { GetKubernetesNamespaces } from '../../store/kubernetes.actions'; diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts b/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts index 0787289ab5..f3d8d9927a 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/release/helm-release-tab-base/helm-release-tab-base.component.ts @@ -4,7 +4,7 @@ import { Store } from '@ngrx/store'; import { LoggerService } from 'frontend/packages/core/src/core/logger.service'; import { IPageSideNavTab } from 'frontend/packages/core/src/features/dashboard/page-side-nav/page-side-nav.component'; import { AppState } from 'frontend/packages/store/src/app-state'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog'; import { PaginatedAction } from 'frontend/packages/store/src/types/pagination.types'; import { EntityRequestAction, WrapperRequestActionSuccess } from 'frontend/packages/store/src/types/request.types'; import { Observable, Subject, Subscription } from 'rxjs'; diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/release/tabs/helm-release-helper.service.ts b/custom-src/frontend/app/custom/kubernetes/workloads/release/tabs/helm-release-helper.service.ts index 723a77bd33..aa8a7b73c9 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/release/tabs/helm-release-helper.service.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/release/tabs/helm-release-helper.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from 'frontend/packages/store/src/app-state'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog'; import { EntityServiceFactory } from 'frontend/packages/store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from 'frontend/packages/store/src/monitors/pagination-monitor.factory'; import { selectEntity } from 'frontend/packages/store/src/selectors/api.selectors'; diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads-entity-generator.ts b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads-entity-generator.ts index cddd1778f4..3f326da1ed 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads-entity-generator.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads-entity-generator.ts @@ -1,10 +1,10 @@ -import { - StratosBaseCatalogEntity, - StratosCatalogEntity, -} from 'frontend/packages/store/src/entity-catalog/entity-catalog-entity'; import { StratosEndpointExtensionDefinition } from 'frontend/packages/store/src/entity-catalog/entity-catalog.types'; import { IFavoriteMetadata } from 'frontend/packages/store/src/types/user-favorites.types'; +import { + StratosBaseCatalogEntity, + StratosCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { kubernetesEntityFactory } from '../../kubernetes-entity-factory'; import { HelmRelease, HelmReleaseGraph, HelmReleaseResource } from '../workload.types'; import { helmReleaseEntityKey, helmReleaseGraphEntityType, helmReleaseResourceEntityType } from './workloads-entity-factory'; diff --git a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.effects.ts b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.effects.ts index 10656a97fc..086bc29fd8 100644 --- a/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.effects.ts +++ b/custom-src/frontend/app/custom/kubernetes/workloads/store/workloads.effects.ts @@ -7,7 +7,7 @@ import { Observable } from 'rxjs'; import { catchError, flatMap, mergeMap } from 'rxjs/operators'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { NormalizedResponse } from '../../../../../../store/src/types/api.types'; import { EntityRequestAction, diff --git a/deploy/ci/travis/check-e2e-pr.sh b/deploy/ci/travis/check-e2e-pr.sh new file mode 100755 index 0000000000..89ab5b6346 --- /dev/null +++ b/deploy/ci/travis/check-e2e-pr.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ -n "${TRAVIS_PULL_REQUEST}" ]; then + if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then + echo "Checking labels on ${TRAVIS_PULL_REQUEST_SLUG} #${TRAVIS_PULL_REQUEST}" + LABEL=$(curl -s "https://api.github.com/repos/${TRAVIS_PULL_REQUEST_SLUG}/pulls/${TRAVIS_PULL_REQUEST}" | jq -r '.labels[] | select(.name == "e2e-debug") | .name') + if [ "${LABEL}" == "e2e-debug" ]; then + echo "PR has the 'e2e-debug' label - enabling debug logging for E2E tests" + export STRATOS_E2E_DEBUG=true + fi + fi +fi diff --git a/deploy/ci/travis/e2e-build-script.sh b/deploy/ci/travis/e2e-build-script.sh index 0021032ab3..48f58af62f 100755 --- a/deploy/ci/travis/e2e-build-script.sh +++ b/deploy/ci/travis/e2e-build-script.sh @@ -13,12 +13,12 @@ LOCAL_BUILD="true" # TRAVIS_COMMIT if [ -z "$TRAVIS_REPO_SLUG" ]; then - echo "Need to be running in Trvis" + echo "Need to be running in Travis" exit 1 fi if [ -z "$TRAVIS_COMMIT" ]; then - echo "Need to be running in Trvis" + echo "Need to be running in Travis" exit 1 fi @@ -40,9 +40,11 @@ function tryGetExistingBuild() { if [ $? -eq 0 ]; then # We found an existing build, so download and unpack it echo "Downloading build package" - tar -xvf ${GZIP_NAME} + tar -xvf ${GZIP_NAME} > /dev/null if [ $? -eq 0 ]; then LOCAL_BUILD="false" + else + echo "Failed to untar the build package" fi rm -rf ${GZIP_NAME} fi diff --git a/deploy/ci/travis/job-e2e-before_script.sh b/deploy/ci/travis/job-e2e-before_script.sh index d744d27824..974019ccac 100755 --- a/deploy/ci/travis/job-e2e-before_script.sh +++ b/deploy/ci/travis/job-e2e-before_script.sh @@ -16,9 +16,14 @@ if [ "${MAILCATCHER}" == "true" ]; then docker run -d -p 1080:80 -p 1025:25 --name mail tophfr/mailcatcher fi +# Start a local UAA - this will take a few seconds to come up in the background +docker run -d -p 8080:8080 splatform/stratos-uaa + # Check that the S3 server is available -curl -k --max-time 20 ${AWS_ENDPOINT} -if [ $? -ne 0 ]; then - echo "Can not contact S3 Server" - exit 1 +if [ -n "${AWS_ENDPOINT}" ]; then + curl -k --max-time 20 ${AWS_ENDPOINT} + if [ $? -ne 0 ]; then + echo "Can not contact S3 Server" + exit 1 + fi fi \ No newline at end of file diff --git a/deploy/ci/travis/run-e2e-tests.sh b/deploy/ci/travis/run-e2e-tests.sh index 857930c1ee..78ba65ac61 100755 --- a/deploy/ci/travis/run-e2e-tests.sh +++ b/deploy/ci/travis/run-e2e-tests.sh @@ -5,6 +5,8 @@ set -e echo "Stratos e2e tests" echo "=================" +DIRPATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && cd ../../.. && pwd)" + echo "Checking docker version" docker version @@ -40,8 +42,6 @@ fi echo "Using local deployment for e2e tests" # Quick deploy locally -# Start a local UAA - this will take a few seconds to come up in the background -docker run -d -p 8080:8080 splatform/stratos-uaa # Build if needed or use existing build for this commit DIRNAME="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -64,6 +64,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 +source "${DIRPATH}/deploy/ci/travis/check-e2e-pr.sh" + # Capture video if configured if [ "$CAPTURE_VIDEO" == "video" ]; then echo "Waiting for ffmpeg install to complete..." diff --git a/deploy/kubernetes/console/README.md b/deploy/kubernetes/console/README.md index dee1153dd4..e4c920c061 100644 --- a/deploy/kubernetes/console/README.md +++ b/deploy/kubernetes/console/README.md @@ -20,9 +20,9 @@ helm repo add stratos https://cloudfoundry.github.io/stratos Check the repository was successfully added by searching for the `console`, for example: ``` -helm search console +helm search repo console NAME CHART VERSION APP VERSION DESCRIPTION -stratos/console 3.1.0 3.1.0 A Helm chart for deploying Stratos UI Console +stratos/console 3.2.0 3.2.0 A Helm chart for deploying Stratos UI Console ``` > Note: Version numbers will depend on the version of Stratos available from the Helm repository @@ -283,10 +283,7 @@ UAA configuration can be specified by providing the following configuration. Create a yaml file with the content below and and update according to your environment and save to a file called `uaa-config.yaml`. ``` uaa: - url: https://uaa.cf-dev.io:2793 - protocol: https:// - port: 2793 - host: uaa.cf-dev.io + endpoint: https://uaa.cf-dev.io:2793 consoleClient: cf consoleClientSecret: consoleAdminIdentifier: cloud_controller.admin diff --git a/docs/extensions.md b/docs/extensions.md index 72a5175213..918c25df18 100644 --- a/docs/extensions.md +++ b/docs/extensions.md @@ -81,7 +81,20 @@ For example: The approach for all of these is the same: 1. Create a new component that will provide the tab contents -2. Ensure that your component is included in the `EntryComponent` section of your custom module +2. Ensure that your component is declared with the `ExtensionService` in the imports of your custom module, for example: +``` + @NgModule({ + imports: [ + ExtensionService.declare([ + ExtensionComponent, + ]) + ], + declarations: [ + ExtensionComponent + ] + }) +``` + 2. Decorate the component with the `StratosTab` decorator, for example: ``` @@ -122,8 +135,8 @@ An action is a icon button that appears at the top-right of a View. For example: The approach for all of these is the same: 1. Create a new component that will provide the contents to show when the action is clicked -2. Ensure that your component is included in the `EntryComponent` section of your custom module -2. Decorate the component with the `StratosAction` decorator, for example: +2. Ensure that your component is declared with the `ExtensionService` in the imports of your custom module +3. Decorate the component with the `StratosAction` decorator, for example: ``` @StratosAction({ @@ -243,16 +256,19 @@ export class ExampleTabExtensionComponent implements OnInit { Save the file. -### Mark the component as an entry component +### Mark the component as an extensions component -The last thing we need to do is to mark our Extension component as an entry component. +The last thing we need to do is to mark our Extension component as an extensions component. -To do this, in a text editor, open the file `src/frontend/app/custom/custom.module.ts` and add the entry components section so it looks like this: +To do this, in a text editor, open the file `src/frontend/app/custom/custom.module.ts` and add the `ExtensionService.declare` to the import sesion, so it looks like this: ``` @NgModule({ imports: [ - CommonModule + CommonModule, + ExtensionService.declare([ + ExampleTabExtensionComponent, + ]) ], declarations: [ExampleTabExtensionComponent], entryComponents: [ExampleTabExtensionComponent] diff --git a/examples/custom-src/frontend/app/custom/custom.module.ts b/examples/custom-src/frontend/app/custom/custom.module.ts index bc8da07ae5..279ef8a0b3 100644 --- a/examples/custom-src/frontend/app/custom/custom.module.ts +++ b/examples/custom-src/frontend/app/custom/custom.module.ts @@ -8,6 +8,7 @@ import { AcmeLoginComponent } from './acme-login/acme-login.component'; import { AcmeSupportInfoComponent } from './acme-support-info/acme-support-info.component'; import { AppActionExtensionComponent } from './app-action-extension/app-action-extension.component'; import { AppTabExtensionComponent } from './app-tab-extension/app-tab-extension.component'; +import { ExtensionService } from '../core/extension/extension-service'; const AcmeCustomizations: CustomizationsMetadata = { copyright: '© 2018 ACME Corp', @@ -20,6 +21,10 @@ const AcmeCustomizations: CustomizationsMetadata = { CoreModule, SharedModule, MDAppModule, + ExtensionService.declare([ + AppTabExtensionComponent, + AppActionExtensionComponent, + ]) ], declarations: [ AcmeLoginComponent, diff --git a/ngcc.config.js b/ngcc.config.js new file mode 100644 index 0000000000..8070a5d38f --- /dev/null +++ b/ngcc.config.js @@ -0,0 +1,16 @@ +// Ignore the deep import warnings on the AJSF library +module.exports = { + packages: { + '@cfstratos/ajsf-core': { + ignorableDeepImportMatchers: [ + /lodash\//, + /json-schema-draft-06.json$/, + ] + }, + '@cfstratos/ajsf-material': { + ignorableDeepImportMatchers: [ + /lodash\//, + ] + }, + }, +}; diff --git a/package-lock.json b/package-lock.json index abc77626a7..0fa8335d5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,19 +5,19 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.26.tgz", - "integrity": "sha512-mCynDvhGLElmuiaK5I6hVleMuZ1Svn7o5NnMW1ItiDlVZu1v49JWOxPS1A7C/ypGmhjl9jMorVtz2IumtLgCXw==", + "version": "0.901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.7.tgz", + "integrity": "sha512-yW/PUEqle55QihOFbmeNXaVTodhfeXkteoFDUpz+YpX3xiQDXDtNbIJSzKOQTojtBKdSMKMvZkQLr+RAa7/1EA==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.26", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.7", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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" @@ -26,362 +26,108 @@ } }, "@angular-devkit/build-angular": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.26.tgz", - "integrity": "sha512-SoeUbl928QgYWZjDNSMs9m/9wslKjqkFXeZpOI398i5/ZbrsjXcbxicLphVCPndhfR6qETV7pCqQnVmAf4zYjA==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.803.26", - "@angular-devkit/build-optimizer": "0.803.26", - "@angular-devkit/build-webpack": "0.803.26", - "@angular-devkit/core": "8.3.26", - "@babel/core": "7.8.7", - "@babel/preset-env": "7.8.7", - "@ngtools/webpack": "8.3.26", - "ajv": "6.10.2", - "autoprefixer": "9.6.1", - "browserslist": "4.10.0", - "cacache": "12.0.2", - "caniuse-lite": "1.0.30001035", + "version": "0.901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.7.tgz", + "integrity": "sha512-NiBwapx/XJqYGzSmENff78i6Yif9PjYDJ9BB+59t2eDofkCZUcPFrhQmRgliO7rt6RATvT81lDP89+LBXCTQPw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.901.7", + "@angular-devkit/build-optimizer": "0.901.7", + "@angular-devkit/build-webpack": "0.901.7", + "@angular-devkit/core": "9.1.7", + "@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.7", + "ajv": "6.12.0", + "autoprefixer": "9.7.4", + "babel-loader": "8.0.6", + "browserslist": "^4.9.1", + "cacache": "15.0.0", + "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.0", - "clean-css": "4.2.1", "copy-webpack-plugin": "5.1.1", "core-js": "3.6.4", - "coverage-istanbul-loader": "2.0.3", - "file-loader": "4.2.0", - "find-cache-dir": "3.0.0", - "glob": "7.1.4", - "jest-worker": "24.9.0", + "css-loader": "3.5.1", + "cssnano": "4.1.10", + "file-loader": "6.0.0", + "find-cache-dir": "3.3.1", + "glob": "7.1.6", + "jest-worker": "25.1.0", "karma-source-map-support": "1.4.0", - "less": "3.9.0", + "less": "3.11.1", "less-loader": "5.0.0", - "license-webpack-plugin": "2.1.2", - "loader-utils": "1.2.3", - "mini-css-extract-plugin": "0.8.0", + "license-webpack-plugin": "2.1.4", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "0.9.0", "minimatch": "3.0.4", - "open": "6.4.0", + "open": "7.0.3", "parse5": "4.0.0", - "postcss": "7.0.17", + "postcss": "7.0.27", "postcss-import": "12.0.1", "postcss-loader": "3.0.0", - "raw-loader": "3.1.0", - "regenerator-runtime": "0.13.3", - "rxjs": "6.4.0", - "sass": "1.22.9", - "sass-loader": "7.2.0", - "semver": "6.3.0", + "raw-loader": "4.0.0", + "regenerator-runtime": "0.13.5", + "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", "source-map": "0.7.3", "source-map-loader": "0.2.4", - "source-map-support": "0.5.13", "speed-measure-webpack-plugin": "1.3.1", - "style-loader": "1.0.0", - "stylus": "0.54.5", + "style-loader": "1.1.3", + "stylus": "0.54.7", "stylus-loader": "3.0.2", - "terser": "4.6.3", - "terser-webpack-plugin": "1.4.3", + "terser": "4.6.10", + "terser-webpack-plugin": "2.3.5", "tree-kill": "1.2.2", - "webpack": "4.39.2", + "webpack": "4.42.0", "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.9.0", - "webpack-merge": "4.2.1", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.1.0-rc.6", - "worker-plugin": "3.2.0" + "webpack-subresource-integrity": "1.4.0", + "worker-plugin": "4.0.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/core": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", - "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.7", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.7", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/preset-env": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.7.tgz", - "integrity": "sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.6", - "@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-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@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.8.6", - "@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.8.6", - "@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.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", - "@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/types": "^7.8.7", - "browserslist": "^4.8.5", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "browserslist": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", - "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.378", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001035", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", - "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "core-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "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" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "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" - } - }, - "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" - } - }, - "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": "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 - }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "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": { - "find-up": "^3.0.0" + "glob": "^7.1.3" } }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, "source-map": { @@ -393,19 +139,19 @@ } }, "@angular-devkit/build-ng-packagr": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.26.tgz", - "integrity": "sha512-gaSJmY09s73ko2Y/J7DUdh1k4f+3GojgWHDBJOZsOjEfF6KPf4HWhPHMKno09yR5CzMVyo8dStirjNYjgL7EXA==", + "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==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.26", - "rxjs": "6.4.0" + "@angular-devkit/architect": "0.901.7", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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" @@ -414,15 +160,15 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.26.tgz", - "integrity": "sha512-rVcMV/HaWK1g1XVbB1Hj0F6icNbguQETxilhbEn2Ut48hT4iywam6a2tz5w33YlH0uspPHwtFrz7EaLbiWUrPw==", + "version": "0.901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.7.tgz", + "integrity": "sha512-Xuce3StdxhcgLYb0BAaFGr3Bzj5EM2OsAqIT15PkikWY1k5cK50vPxoC/BkX4QDL9eXSHtqAfMBfA6h5N422vw==", "dev": true, "requires": { - "loader-utils": "1.2.3", + "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "1.10.0", - "typescript": "3.5.3", + "tslib": "1.11.1", + "typescript": "3.6.5", "webpack-sources": "1.4.3" }, "dependencies": { @@ -432,29 +178,29 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "typescript": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.5.tgz", + "integrity": "sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.26.tgz", - "integrity": "sha512-lMmNUza+Qb1/XgVMpj2A2jFr7APvJdX57aLxNPnDg/pM0rWbAMXLUvrphqxZuyqjOwfQcHWmnuVxfLpT0qJSAw==", + "version": "0.901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.7.tgz", + "integrity": "sha512-pTLW5Eqy9cHgv78LKiH0e30lxqKzUPjh1djvNtFsEemOHsfKQdAfjLjikoaQvqMoBKVaUU7r2vmyyS17cH+1yw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.26", - "@angular-devkit/core": "8.3.26", - "rxjs": "6.4.0" + "@angular-devkit/architect": "0.901.7", + "@angular-devkit/core": "9.1.7", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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" @@ -463,46 +209,22 @@ } }, "@angular-devkit/core": { - "version": "8.3.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.26.tgz", - "integrity": "sha512-b1ng9091o33s55/cwQYh1kboiJtj8y8z8xQWATDI9kRmNIQkWYVwVa/MzgPRJ4bzbEGG3zIUHCsp52A6vuGr2A==", + "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.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "ajv": "6.12.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.4", "source-map": "0.7.3" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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" @@ -517,19 +239,20 @@ } }, "@angular-devkit/schematics": { - "version": "8.3.26", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.26.tgz", - "integrity": "sha512-IoZbXVFGLvVi5d0ozfssWDXuzot0/pMSKbQPzWIG8K7nCo7nNMVYpsMHrEVYUikA9EQEL5LqMCGohH36/zVPcA==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.7.tgz", + "integrity": "sha512-oeHPJePBcPp/bd94jHQeFUnft93PGF5iJiKV9szxqS8WWC5OMZ5eK7icRY0PwvLyfenspAZxdZcNaqJqPMul5A==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.26", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.7", + "ora": "4.0.3", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "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" @@ -538,48 +261,44 @@ } }, "@angular/animations": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.14.tgz", - "integrity": "sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA4HOMj0TTXKZ+Jzkg==", - "requires": { - "tslib": "^1.9.0" - } + "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==" }, "@angular/cdk": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.3.tgz", - "integrity": "sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.4.tgz", + "integrity": "sha512-iw2+qHMXHYVC6K/fttHeNHIieSKiTEodVutZoOEcBu9rmRTGbLB26V/CRsfIRmA1RBk+uFYWc6UQZnMC3RdnJQ==", "requires": { - "parse5": "^5.0.0", - "tslib": "^1.7.1" + "parse5": "^5.0.0" } }, "@angular/cli": { - "version": "8.3.26", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.26.tgz", - "integrity": "sha512-/dZik0ALcMSNaZdzqeG5hnFqyezrPQlWv+NXPidp1l0VTIwdEmjWmL26QpSBBvZ9bqXjY5/5SZYb+zZlGu78Kg==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.7.tgz", + "integrity": "sha512-NhsIa725S/U/n7nDxp6ForusdYHEXF4aSIvsFRdoK6vbQ889c5e1Rdj+T5EWXLmpQZxeprSKhLI2alNX0nVhhQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.26", - "@angular-devkit/core": "8.3.26", - "@angular-devkit/schematics": "8.3.26", - "@schematics/angular": "8.3.26", - "@schematics/update": "0.803.26", + "@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", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "^4.1.1", + "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "6.5.1", - "npm-package-arg": "6.1.0", - "npm-pick-manifest": "3.0.2", - "open": "6.4.0", - "pacote": "9.5.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.0.0", + "open": "7.0.3", + "pacote": "9.5.12", "read-package-tree": "5.3.1", - "rimraf": "3.0.0", - "semver": "6.3.0", + "rimraf": "3.0.2", + "semver": "7.1.3", "symbol-observable": "1.2.0", - "universal-analytics": "^0.4.20", - "uuid": "^3.3.2" + "universal-analytics": "0.4.20", + "uuid": "7.0.2" }, "dependencies": { "ansi-colors": { @@ -604,183 +323,134 @@ "dev": true }, "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "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" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "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==", "dev": true } } }, "@angular/common": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", - "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.9.tgz", + "integrity": "sha512-y/tJtkuOJhV2kcaXZyrLZH84i4uQ1r+vaaEHvXj+JZYfYfcMMd/TDqMiPcIkUb3RxqghtZ+q0ZNW5D1Nlru3Pw==" }, "@angular/compiler": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", - "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.9.tgz", + "integrity": "sha512-kjFgaTB2ckr9lgmkS1dOGRT7kmzpQueydxsxXSHWgICNVE6F/u1PHyeSOyJRpxW0GnrkLq3QM2EUFnQGGga5bg==" }, "@angular/compiler-cli": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", - "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.9.tgz", + "integrity": "sha512-aLr2eaDlREN8XybgTbelvjtSZ8eAkxBPilnkddc700BgiC6ImyUSKaItOwa8bnjQwq4Wlz5eVG0ibsrX+5MXwg==", "dev": true, "requires": { "canonical-path": "1.0.0", - "chokidar": "^2.1.1", + "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", "source-map": "^0.6.1", - "tslib": "^1.9.0", - "yargs": "13.1.0" + "sourcemap-codec": "^1.4.8", + "yargs": "15.3.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "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": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "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 - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": { - "locate-path": "^3.0.0" + "color-name": "~1.1.4" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "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=", + "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 }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "normalize-path": { + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "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 }, - "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==", + "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": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "p-locate": "^4.1.0" } }, "p-limit": { @@ -793,12 +463,12 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-try": { @@ -807,10 +477,16 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "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==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "source-map": { @@ -820,40 +496,23 @@ "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==", + "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": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "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" + "ansi-regex": "^5.0.0" } }, "which-module": { @@ -862,29 +521,40 @@ "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", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^18.1.0" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -894,84 +564,59 @@ } }, "@angular/core": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", - "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.9.tgz", + "integrity": "sha512-q/DERgVU6vK2LtTcdVCGGBcoO424WsEfImh3Vcuy+P/ZVmthlDUC/+q+tSKt8MMf4hLpxFDQJE8vUSkktj7QEw==" }, "@angular/flex-layout": { - "version": "8.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.27.tgz", - "integrity": "sha512-qmpvQPesU4ZQ56IscwgmVRpK2UnyV+gwvXUql7TMv0QV215hLcHczjGsrKkLfW2By5E7XEyDat9br72uVXcPMw==", - "requires": { - "tslib": "^1.7.1" - } + "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==" }, "@angular/forms": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.14.tgz", - "integrity": "sha512-zhyKL3CFIqcyHJ/TQF/h1OZztK611a6rxuPHCrt/5Sn1SuBTJJQ1pPTkOYIDy6IrCrtyANc8qB6P17Mao71DNQ==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.9.tgz", + "integrity": "sha512-r675yImnb/0pY7K5W3V2ITa7YETu1I2AS+bRfII6UQ6gthyeFFOHb5noa7YneC2yqQiM6E4DQmF5ig3daPuFNg==" }, "@angular/language-service": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", - "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.9.tgz", + "integrity": "sha512-yT6HPpdAe2mD9HRoTCiWFog1MRJt+0j+CLbI/Ql7C6pH6vbjmfsJ55xMmQ7eS6trsnebpMWTUv1f2GRykv3ygw==", "dev": true }, "@angular/material": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.3.tgz", - "integrity": "sha512-SOczkIaqes+r+9XF/UUiokidfFKBpHkOPIaFK857sFD0FBNPvPEpOr5oHKCG3feERRwAFqHS7Wo2ohVEWypb5A==", - "requires": { - "tslib": "^1.7.1" - } + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.4.tgz", + "integrity": "sha512-LkoTXE6B0slvMhvfZDdPWaz4yaYLkaAp5VSPunI9pxGsPxzqEV9e210wC1/sjG/76Nk8Ep7/2z9XKac8Q9bMwA==" }, "@angular/material-moment-adapter": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.3.tgz", - "integrity": "sha512-x0WE9MyQajqzGPYKm8eHcDmWWlwiobOX9rZ+V5uqY80fsvm2czk6TYnc1drFYcPAHIaIcx7je7NYOULPF1rTpw==", - "requires": { - "tslib": "^1.7.1" - } + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-9.2.4.tgz", + "integrity": "sha512-V5xkL+YUec3nDGRaJB72mJTUtdUvGaG9WCQEdr45viDWFGjQaEpS6msuScBLp0PwsN8Wt0n69eZg0ULgxPBa5g==" }, "@angular/platform-browser": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.14.tgz", - "integrity": "sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.9.tgz", + "integrity": "sha512-V861X3MxJp1AlMTnkUPldpBLIJbApXF3ka0A5Dq2nVJCyOFeteGkaRWSBgqe2jxmq+LVpJbzcNvtDFXw6mQ0jA==" }, "@angular/platform-browser-dynamic": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz", - "integrity": "sha512-mO2JPR5kLU/A3AQngy9+R/Q5gaF9csMStBQjwsCRI0wNtlItOIGL6+wTYpiTuh/ux+WVN1F2sLcEYU4Zf1ud9A==", - "requires": { - "tslib": "^1.9.0" - } + "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==" }, "@angular/platform-server": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.14.tgz", - "integrity": "sha512-gGAgxMmac5CyLcwgB+qCD1o75An0NmpREh/lxPgz6n6Zs9JqdqpZROLSIHqGBaU6MWo1qiOfS6L08HwYPx7ipQ==", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.1.9.tgz", + "integrity": "sha512-PtOUE6Vxnrg03/zJbjnZ6BbctAEdFjAbHr8zbGhHa2q504DlY9OJACRCqcP8tIpW9nbDDKqvr/RENONmISichA==", "requires": { "domino": "^2.1.2", - "tslib": "^1.9.0", - "xhr2": "^0.1.4" + "xhr2": "^0.2.0" } }, "@angular/router": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz", - "integrity": "sha512-DHA2BhODqV7F0g6ZKgFaZgbsqzHHWRcfWchCOrOVKu2rYiKUTwwHVLBgZAhrpNeinq2pWanVYSIhMr7wy+LfEA==", - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.9.tgz", + "integrity": "sha512-4u+CWMPB4hCkAsFCEzC94YEWT0wVozqGkc/Dortt2hFaqvZpIegg6iJVZlDxuyDjzFYBPnnbTDdgiTTA8ckfuA==" }, "@babel/code-frame": { "version": "7.5.5", @@ -983,11 +628,12 @@ } }, "@babel/compat-data": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.6.tgz", - "integrity": "sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", + "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "dev": true, "requires": { - "browserslist": "^4.11.1", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" } @@ -996,6 +642,7 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", @@ -1016,35 +663,36 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -1052,7 +700,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -1060,6 +709,7 @@ "version": "7.9.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "dev": true, "requires": { "@babel/types": "^7.9.0", "jsesc": "^2.5.1", @@ -1068,3520 +718,3139 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", + "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz", - "integrity": "sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "dev": true, "requires": { - "@babel/compat-data": "^7.9.6", - "browserslist": "^4.11.1", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "@babel/helper-compilation-targets": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", + "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@babel/compat-data": "^7.10.1", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", + "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", + "regexpu-core": "^4.7.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "@babel/helper-define-map": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "dev": true, "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-replace-supers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", - "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.9.6", - "@babel/types": "^7.9.6" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, - "@babel/generator": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, "requires": { - "@babel/types": "^7.9.6", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/types": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true }, - "@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" - }, - "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", - "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "@babel/helper-explode-assignable-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.6", - "@babel/types": "^7.9.6" + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, "@babel/generator": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, "requires": { - "@babel/types": "^7.9.6", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/types": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } }, "@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.6", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" - } } }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "optional": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz", - "integrity": "sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.9.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", - "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.8", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "optional": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-async-to-generator": { + "@babel/helper-function-name": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, - "@babel/plugin-transform-block-scoped-functions": { + "@babel/helper-get-function-arity": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/types": "^7.8.3" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "@babel/helper-hoist-variables": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", + "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" + "@babel/types": "^7.10.1" }, "dependencies": { - "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" - } - }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.1", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz", - "integrity": "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==", - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz", - "integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==", - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz", - "integrity": "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==", - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", - "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" - } + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true }, - "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "@babel/helper-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "lodash": "^4.17.13" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "@babel/helper-remap-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@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==", - "optional": 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", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", - "@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/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "optional": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", - "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } - } - } - }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@cypress/webpack-preprocessor": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.5.tgz", - "integrity": "sha512-B4miSaS3VCMVSlfuvbWCjytTywdnquRsF1tQ3quC7TGUzEXnQZ4+o8WUKibjMozrOomALkUdMxqOJ1ib5oFkKw==", + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, "requires": { - "@babel/core": "^7.0.1", - "@babel/preset-env": "^7.0.0", - "babel-loader": "^8.0.2", - "bluebird": "3.7.1", - "debug": "4.1.1" + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" }, "dependencies": { - "bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/highlight": "^7.10.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@ngrx/effects": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.6.0.tgz", - "integrity": "sha512-JdyJLQbv/wnE0ZPY9DcDOtF9PzJuzsKWmIWgIGunHF18wdjk5O8Zpkcrxq18wDRL6geg5UTtNJRMvTQhpDbzow==" - }, - "@ngrx/router-store": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.6.0.tgz", - "integrity": "sha512-4Dvl6dfOj15lNZ63wucRNcTEHUi0hEqapOBVRslfAsnaSRo2t1lOvfX7b68IbxPiqzabTBdIeEkJwAC2q/rZZg==" - }, - "@ngrx/store": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.6.0.tgz", - "integrity": "sha512-K4cvCEa+5hw9qrETQWO+Cha3YbVCAT8yaIKJr/N35KntTL9mQMjoL+51JWLZfBwPV0e19CFgJIyrBnVUTxwr2A==" - }, - "@ngrx/store-devtools": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.6.0.tgz", - "integrity": "sha512-PWZmiOZE0J56GFfZpuzKLb7w0K2c6OXZSp/eWDeAvtdHFD4/Nas1i4TXtiWWMWWnSZeNs0hNIg4nFJXi2EddJQ==" - }, - "@ngtools/webpack": { - "version": "8.3.26", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.26.tgz", - "integrity": "sha512-w28u3Akvn37hE0HYwy/l6YrDBWxzh7TceYJz+5hRLmJu+BevSY/rNjZ22AlpVD8ZWqhFfvzJS9cuvAqDgH9rtw==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.26", - "enhanced-resolve": "4.1.0", - "rxjs": "6.4.0", - "tree-kill": "1.2.2", - "webpack-sources": "1.4.3" - }, - "dependencies": { - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "@babel/types": "^7.8.3" } }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "@babel/helper-wrap-function": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@nrwl/angular": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/angular/-/angular-8.5.2.tgz", - "integrity": "sha512-wZ8zMsSjtsFMO9XzwUgCCmYwTx+gbLyCglAIFF6EFs0c2sDYsS4MDoKBbGd4K+nHBYVB0Thu7FzPnaB3jwgWNg==", - "requires": { - "@angular-devkit/schematics": "8.3.3", - "@nrwl/cypress": "8.5.2", - "@nrwl/jest": "8.5.2", - "@schematics/angular": "8.3.3", - "jasmine-marbles": "~0.6.0" + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" }, "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", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.3.tgz", - "integrity": "sha512-t5I77YeRCWpr5PJMQn8iCu2zHqnQt7qqxt66ejmsDnFgCQDw2G1IQl48AzjegJybIoRCaWX12yUZaS5aaJm5Cg==", + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" + "@babel/highlight": "^7.10.1" } }, - "@schematics/angular": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.3.tgz", - "integrity": "sha512-8dRe7mBPqesscXG56pg7bWgDz+xb8jmU/Yp6LizOL3U0EoO/QV6yuVgPkgiIMSaGQaP3PBzZ7h0xuOOogWJ6ig==", + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3" + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "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==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@babel/types": "^7.10.1" } }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/types": "^7.10.1" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "@nrwl/cli": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-8.5.2.tgz", - "integrity": "sha512-4rEnQBnyhFWC7iKCYgdKUgZUifUSPBMwmzL2PWXvW+cuWHPDq1B40jEiBECZ2nZSxTJNYOxN6UifR3/6Mu9kaA==", - "dev": true, - "requires": { - "@nrwl/tao": "8.5.2", - "tmp": "0.0.33", - "yargs": "^11.0.0", - "yargs-parser": "10.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", "dev": true }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "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=", + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" } }, - "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==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "ms": "^2.1.1" } }, - "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" - } - }, - "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 - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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 - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "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=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", - "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } } } }, - "@nrwl/cypress": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-8.5.2.tgz", - "integrity": "sha512-jU74ew/RUqpn+SJHkWPClrYHdoRIt/yl2My7hEYUbKo/t5pxuqpF16VB9EoevSfx+NGsuZ7vpp+rbt3lczVCVA==", + "@babel/helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "dev": true, "requires": { - "@angular-devkit/architect": "0.803.3", - "@angular-devkit/core": "8.3.3", - "@cypress/webpack-preprocessor": "~4.1.0", - "fork-ts-checker-webpack-plugin": "^0.4.9", - "tree-kill": "1.2.1", - "ts-loader": "5.3.1", - "tsconfig-paths-webpack-plugin": "3.2.0", - "webpack-node-externals": "1.7.2" + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.803.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.3.tgz", - "integrity": "sha512-PInK3JTLZ+r/3MK52rocD0IwmxKVULnoed4XuxdklD1zh7e7Aj9WIoTGdVgzaTwdUFaeuBdAy4UqwfhHEmn5MQ==", + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" + "@babel/highlight": "^7.10.1" } }, - "@angular-devkit/core": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.3.tgz", - "integrity": "sha512-E49GCnn06q79Xd5SC/+8CDRF1wp9wQqP6HKJVVMijoi3NOrMQTuHTesPURvve2xbkCYqQOVlMEonhOJF5vpnoQ==", + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, "requires": { - "ajv": "6.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", - "source-map": "0.7.3" + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "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==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@babel/types": "^7.10.1" } }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/types": "^7.10.1" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true }, - "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" - } - } - }, - "@nrwl/jest": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-8.5.2.tgz", - "integrity": "sha512-jLPG8dJlEXVFLFFBORB0v2JPPW5mM4bIbWj/cWMJx5iWMI+ITJoG+5lGl8zKwCqBytuXzFDoCdfsfacLuVvp7A==", - "requires": { - "@angular-devkit/architect": "0.803.3", - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.803.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.3.tgz", - "integrity": "sha512-PInK3JTLZ+r/3MK52rocD0IwmxKVULnoed4XuxdklD1zh7e7Aj9WIoTGdVgzaTwdUFaeuBdAy4UqwfhHEmn5MQ==", + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@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", - "source-map": "0.7.3" - } + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", + "dev": true }, - "@angular-devkit/schematics": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.3.tgz", - "integrity": "sha512-t5I77YeRCWpr5PJMQn8iCu2zHqnQt7qqxt66ejmsDnFgCQDw2G1IQl48AzjegJybIoRCaWX12yUZaS5aaJm5Cg==", + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" } }, - "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==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { - "tslib": "^1.9.0" + "ms": "^2.1.1" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "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 } } }, - "@nrwl/tao": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-8.5.2.tgz", - "integrity": "sha512-nZq9k5YPO6N7uEDEt4T0f0Ai1gI5mWIUOjt5ey8oSKCaac4p8uHloGKbqEGS0zS23hBLOMPgXg+852XSfDW/pw==", + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.3", - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3", - "inquirer": "^6.3.1", - "minimist": "^1.2.0", - "strip-json-comments": "2.0.1" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.803.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.3.tgz", - "integrity": "sha512-PInK3JTLZ+r/3MK52rocD0IwmxKVULnoed4XuxdklD1zh7e7Aj9WIoTGdVgzaTwdUFaeuBdAy4UqwfhHEmn5MQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" - } - }, - "@angular-devkit/core": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.3.tgz", - "integrity": "sha512-E49GCnn06q79Xd5SC/+8CDRF1wp9wQqP6HKJVVMijoi3NOrMQTuHTesPURvve2xbkCYqQOVlMEonhOJF5vpnoQ==", - "dev": true, - "requires": { - "ajv": "6.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.3.tgz", - "integrity": "sha512-t5I77YeRCWpr5PJMQn8iCu2zHqnQt7qqxt66ejmsDnFgCQDw2G1IQl48AzjegJybIoRCaWX12yUZaS5aaJm5Cg==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "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==", + "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 } } }, - "@nrwl/workspace": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-8.5.2.tgz", - "integrity": "sha512-wbwqmVJKWZLsQJyLB6LK6/FVUH/lluFdqF5ULa8BupdV6jVz8htpyeiZn4uka46Y16JrzTyfEs1ihfKRa6tKIA==", + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", + "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "@angular-devkit/schematics": "8.3.3", - "@nrwl/cli": "8.5.2", - "chalk": "2.4.2", - "cosmiconfig": "4.0.0", - "fs-extra": "6.0.0", - "graphviz": "0.0.8", - "ignore": "5.0.4", - "npm-run-all": "4.1.5", - "opn": "^5.3.0", - "prettier": "1.18.2", - "rxjs": "^6.4.0", - "semver": "5.4.1", - "strip-json-comments": "2.0.1", - "tmp": "0.0.33", - "viz.js": "^1.8.1", - "yargs": "^11.0.0", - "yargs-parser": "10.0.0" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", + "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", + "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", + "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", + "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "globals": "^11.1.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==", + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "ajv": "6.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", - "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@babel/highlight": "^7.10.1" } }, - "@angular-devkit/schematics": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.3.tgz", - "integrity": "sha512-t5I77YeRCWpr5PJMQn8iCu2zHqnQt7qqxt66ejmsDnFgCQDw2G1IQl48AzjegJybIoRCaWX12yUZaS5aaJm5Cg==", + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.3", - "rxjs": "6.4.0" - }, - "dependencies": { - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/types": "^7.10.1" } }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "@babel/types": "^7.10.1" } }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "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=", + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", "dev": true }, - "fs-extra": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", - "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==", + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "ignore": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz", - "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "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=", + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.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==", + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", + "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", + "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "@babel/highlight": "^7.10.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "@babel/types": "^7.10.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.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 - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "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=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "yargs-parser": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", - "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } }, - "@schematics/angular": { - "version": "8.3.26", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.26.tgz", - "integrity": "sha512-NJCykMxB9RKL+Tmr9xHftUevsivKGsQZQKjkub528wrSgwrCWoFCxGWV31iOXkT3TlBWmuibH6MZkrWbCLX4Sw==", + "@babel/plugin-transform-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.26", - "@angular-devkit/schematics": "8.3.26" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@schematics/update": { - "version": "0.803.26", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.26.tgz", - "integrity": "sha512-r284UN3HP/UgxK80SG3MDlbF4qPS6EitEqwdSBqXizUYRlV6ovG9vHMLpNruWE0B6vfYbSAn1YvvIwW/ORL1Cw==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.26", - "@angular-devkit/schematics": "8.3.26", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", - "pacote": "9.5.5", - "rxjs": "6.4.0", - "semver": "6.3.0", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.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 - } + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@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": "12.1.0", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-12.1.0.tgz", - "integrity": "sha512-M3H3S/JejG4wKOYwuuwfJrC28XhU3LWhVWKDaZcgA+goRxfEbVbnH7IYcIep5JgFLv17qg7lxhJHtkaySr7Fxg==", - "requires": { - "d3": "^4.10.2", - "d3-array": "^1.2.1", - "d3-brush": "^1.0.4", - "d3-color": "^1.0.3", - "d3-force": "^1.1.0", - "d3-format": "^1.2.0", - "d3-hierarchy": "^1.1.5", - "d3-interpolate": "^1.1.5", - "d3-scale": "^1.0.6", - "d3-selection": "^1.1.0", - "d3-shape": "^1.2.0", - "d3-time-format": "^2.1.0" + "@babel/plugin-transform-modules-amd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", + "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@swimlane/ngx-graph": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-6.2.0.tgz", - "integrity": "sha512-SiWd5iV6B1pTITlzMnbqav9XTmtaRgQJfROwqIZVEkliXzpyDC7VwTKE07C/5IK4oyWAAU5+v9fgBYGo0rud5Q==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", + "dev": true, "requires": { - "@swimlane/ngx-charts": "^12.0.1", - "d3-dispatch": "^1.0.3", - "d3-ease": "^1.0.5", - "d3-force": "^1.1.0", - "d3-selection": "^1.2.0", - "d3-shape": "^1.2.0", - "d3-timer": "^1.0.7", - "d3-transition": "^1.1.1", - "dagre": "^0.8.4", - "transformation-matrix": "^1.15.3", - "tslib": "^1.9.0", - "webcola": "^3.3.8" - }, - "dependencies": { - "d3-ease": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", - "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" - } + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@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==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", + "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", "dev": true, "requires": { - "defer-to-connect": "^1.0.1" + "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true - }, - "@tweenjs/tween.js": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-17.4.0.tgz", - "integrity": "sha512-J3fzl1F6wvh8KXVVcIuHN12xi1ZDcPA/0Vix+ZcJYwZWVHUwfIqfvzYXXEw7ybeev6477KCTt9fKydU+ajUqcg==" - }, - "@types/bluebird": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.32.tgz", - "integrity": "sha512-dIOxFfI0C+jz89g6lQ+TqhGgPQ0MxSnh/E4xuC0blhFtyW269+mPG5QeLgbdwst/LvdP8o1y0o/Gz5EHXLec/g==", - "dev": true - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", - "dev": true - }, - "@types/circular-json": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/circular-json/-/circular-json-0.4.0.tgz", - "integrity": "sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg==" - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/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/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "@babel/plugin-transform-modules-umd": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", + "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", "dev": true, "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@types/jasmine": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", - "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", "dev": true, "requires": { - "@types/jasmine": "*" + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "@types/karma": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/karma/-/karma-3.0.9.tgz", - "integrity": "sha512-GEhyutKIjZstOI1o9HHu58ApHLdgpyvihiUzLaPK3Ig5LIjRTagtSB5RbwKsmfKjmoh0qPNOCmZTYL37VTTcbA==", + "@babel/plugin-transform-new-target": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", + "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", "dev": true, "requires": { - "@types/bluebird": "*", - "@types/node": "*", - "log4js": "^4.0.0" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@types/marked": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.6.5.tgz", - "integrity": "sha512-6kBKf64aVfx93UJrcyEZ+OBM5nGv4RLsI6sR1Ar34bpgvGVRoyTgpxn4ZmtxOM5aDTAaaznYuYUH8bUX3Nk3YA==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/moment-timezone": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.13.tgz", - "integrity": "sha512-SWk1qM8DRssS5YR9L4eEX7WUhK/wc96aIr4nMa6p0kTk9YhGGOJjECVhIdPEj13fvJw72Xun69gScXSZ/UmcPg==", + "@babel/plugin-transform-object-super": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", + "dev": true, "requires": { - "moment": ">=2.14.0" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" } }, - "@types/node": { - "version": "12.12.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.43.tgz", - "integrity": "sha512-KUyZdkGCnVPuXfsKmDUu2XLui65LZIJ2s0M57noy5e+ixUT2oK33ep7zlvgzI8LElcWqbf8AR+o/3GqAPac2zA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/request": { - "version": "2.48.4", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", - "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", + "@babel/plugin-transform-parameters": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", "dev": true, "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" }, "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "@babel/plugin-transform-property-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", "dev": true, "requires": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", - "dev": true - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "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==" - }, - "@types/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", - "dev": true - }, - "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "@babel/plugin-transform-regenerator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", "dev": true, "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "regenerator-transform": "^0.14.2" } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "@babel/plugin-transform-reserved-words": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", + "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@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==", - "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==", - "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==", - "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==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@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==", - "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==", + "@babel/plugin-transform-spread": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@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==", - "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==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", "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" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" } }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "@babel/plugin-transform-template-literals": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", + "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", "dev": true, "requires": { - "@xtuc/long": "4.2.2" + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "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==", + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", "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" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, - "@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==", + "@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": { - "@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" + "@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", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@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/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.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==", + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", "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" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, - "@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==", + "@babel/runtime": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "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" + "regenerator-runtime": "^0.13.4" } }, - "@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==", + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "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", - "@xtuc/long": "4.2.2" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, - "@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==", + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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 + } } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, + "@cfstratos/ajsf-core": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cfstratos/ajsf-core/-/ajsf-core-0.1.5.tgz", + "integrity": "sha512-IMLZJW8I173XovjV7k4hQBXWwr3dPsUa8mLvdVNVUY1RUIv6fY6+QsJXggMb+VMxTSqn+HOq7S1WfEH/Xrt1Dg==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "ajv": "^6.10.0", + "lodash-es": "^4.17.15" } }, - "acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true + "@cfstratos/ajsf-material": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cfstratos/ajsf-material/-/ajsf-material-0.1.5.tgz", + "integrity": "sha512-e0BSgFho4D4H76YhRBt9xg5zGuoJlcuMs7eWdSABZhW7LKHKKpLWqoGHo6qX4Q3rFTADxXiljKk86FjrMaYfrQ==", + "requires": { + "@cfstratos/ajsf-core": "~0.1.5", + "lodash-es": "^4.17.15" + } }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "acorn": "^3.0.4" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "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 + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "adm-zip": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "angular2-virtual-scroll": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/angular2-virtual-scroll/-/angular2-virtual-scroll-0.4.16.tgz", - "integrity": "sha512-6NWk0DjCh4ebU8+LgfBoKYyp3McxDA/k5vTnEiV32VpVnyhN//eThZpVpggI1D2fJBqgTAY09C8v++qXHHLP7A==", - "requires": { - "@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==", + "@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==", "dev": true, "requires": { - "string-width": "^3.0.0" + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.1", + "loader-utils": "^1.4.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.4" }, "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==", + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "minimist": "^1.2.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==", + "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": { - "ansi-regex": "^4.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true + "@ngrx/effects": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-9.2.0.tgz", + "integrity": "sha512-8V09zDIPehGpzgfcgyczelovsVYJvDQhN9wHt37K5A+YCG0CI8nj8FmKokHATwv/S62YqFrOVnr/TZacxpDhBw==" }, - "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==", + "@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==" + }, + "@ngrx/store": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-9.2.0.tgz", + "integrity": "sha512-V8AI3mxbMztVpbZpALkLZYlGkofKcu9GaOCY5e+sZ1VcJ90oxhFjBpnmd6MuVdmhep1XAHALb1B8ZbBFn+xsgQ==" + }, + "@ngrx/store-devtools": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-9.2.0.tgz", + "integrity": "sha512-/FvgcpjO4IvwNFnRVoHGikAvckr6fxKf4NgYoTQ9giI8xavolLvuQUHxzH20legi5dgZz34ii2m2g1Q7OxEV8w==" + }, + "@ngtools/webpack": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.7.tgz", + "integrity": "sha512-A7VB2I42Kn+7jl0tDKzGNLAoZLWSqkKo9Hg1bmKpvAAIz+DSbq3uV+JWgGgTprM3tn0lfkVgmqk4H17HKwAOcg==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "@angular-devkit/core": "9.1.7", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.4", + "webpack-sources": "1.4.3" + }, + "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" + } + } } }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, "requires": { - "color-convert": "^1.9.0" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@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==", + "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "@rollup/pluginutils": "^3.0.8", + "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" } }, - "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==", - "dev": true - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "@rollup/plugin-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.0.2.tgz", + "integrity": "sha512-t4zJMc98BdH42mBuzjhQA7dKh0t4vMJlUka6Fz0c+iO5IVnWaEMiYBy1uBj9ruHZzXBW23IPDGL9oCzBkQ9Udg==", "dev": true, "requires": { - "buffer-equal": "^1.0.0" + "@rollup/pluginutils": "^3.0.4" } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "@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==", "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "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" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "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" + } + } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@rollup/pluginutils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz", + "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "micromatch": "^4.0.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=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-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=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "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" + } + } + } + }, + "yargs-parser": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", + "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", + "requires": { + "camelcase": "^4.1.0" + } + } } }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "@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": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@angular-devkit/core": "9.1.7", + "@angular-devkit/schematics": "9.1.7" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "@schematics/update": { + "version": "0.901.7", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.7.tgz", + "integrity": "sha512-6IpQVFvbu47CrXfqqHAzv2vi7AOdfi1S+SiayXU6FWTeA2wV47H8R60VjxurL8JkDGoVhFgC4+lK6KG++g3dQw==", "dev": true, "requires": { - "make-iterator": "^1.0.0" + "@angular-devkit/core": "9.1.7", + "@angular-devkit/schematics": "9.1.7", + "@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-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==", + "dev": true + } } }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "@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 }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "@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==", + "requires": { + "d3-array": "^2.4.0", + "d3-brush": "^1.1.5", + "d3-color": "^1.4.0", + "d3-format": "^1.4.2", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "d3-selection": "^1.4.1", + "d3-shape": "^1.3.7", + "d3-time-format": "^2.2.2", + "d3-transition": "^1.3.2" + } + }, + "@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==", + "requires": { + "@swimlane/ngx-charts": "^13.0.1", + "d3-dispatch": "^1.0.3", + "d3-ease": "^1.0.5", + "d3-force": "^1.1.0", + "d3-selection": "^1.2.0", + "d3-shape": "^1.2.0", + "d3-timer": "^1.0.7", + "d3-transition": "^1.1.1", + "dagre": "^0.8.4", + "transformation-matrix": "^1.15.3", + "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": { - "make-iterator": "^1.0.0" + "defer-to-connect": "^1.0.1" } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "dev": true }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "@tweenjs/tween.js": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-17.4.0.tgz", + "integrity": "sha512-J3fzl1F6wvh8KXVVcIuHN12xi1ZDcPA/0Vix+ZcJYwZWVHUwfIqfvzYXXEw7ybeev6477KCTt9fKydU+ajUqcg==" + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", "dev": true }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "@types/circular-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/circular-json/-/circular-json-0.4.0.tgz", + "integrity": "sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", "dev": true, "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "@types/minimatch": "*", + "@types/node": "*" } }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "@types/jasmine": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", + "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", "dev": true }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", "dev": true, "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "@types/jasmine": "*" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/karma": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-5.0.0.tgz", + "integrity": "sha512-5quuLnxdJWkzJCEwFatOClM6O7EkeDWfXltGySb01LQnBVjtbLzIky9JLW0IKt+JfzurUjwj7b7Sb/Omsx4QYA==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "@types/node": "*", + "log4js": "^4.0.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "@types/marked": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.4.tgz", + "integrity": "sha512-fdg0NO4qpuHWtZk6dASgsrBggY+8N4dWthl1bAQG9ceKUNKFjqpHaDKCAhRUI6y8vavG7hLSJ4YBwJtZyZEXqw==" + }, + "@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 }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "@types/moment-timezone": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.13.tgz", + "integrity": "sha512-SWk1qM8DRssS5YR9L4eEX7WUhK/wc96aIr4nMa6p0kTk9YhGGOJjECVhIdPEj13fvJw72Xun69gScXSZ/UmcPg==", + "requires": { + "moment": ">=2.14.0" + } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "@types/node": { + "version": "13.13.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.11.tgz", + "integrity": "sha512-FX7mIFKfnGCfq10DGWNhfCNxhACEeqH5uulT6wRRA1KEt7zgLe0HdrAd9/QQkObDqp2Z0KEV3OAmNgs0lTx5tQ==", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "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" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "@types/request": { + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.4.tgz", + "integrity": "sha512-W1t1MTKYR8PxICH+A4HgEIPuAC3sbljoEVfyZbeFJJDbr30guDspJri2XOaM2E+Un7ZjrihaDi7cf6fPa2tbgw==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } } } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "@types/node": "*" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "@types/stacktrace-js": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/stacktrace-js/-/stacktrace-js-0.0.32.tgz", + "integrity": "sha512-SdxmlrHfO0BxgbBP9HZWMUo2rima8lwMjPiWm6S0dyKkDa5CseamktFhXg8umu3TPVBkSlX6ZoB5uUDJK89yvg==" + }, + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", "dev": true, "requires": { - "lodash": "^4.17.14" + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "async-array-reduce": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", - "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@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==", "dev": true }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "@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==", + "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==", + "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==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" + "@webassemblyjs/wast-printer": "1.8.5" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "@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==", "dev": true }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "@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==", "dev": true, "requires": { - "async-done": "^1.2.2" + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "@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==", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "@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==", + "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" + } }, - "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "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 + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", "dev": true }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "@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==", "dev": true, "requires": { - "ast-types-flow": "0.0.7" + "@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" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@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==", + "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "@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" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "@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==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "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 - } + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, - "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", - "optional": true, - "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "optional": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "optional": 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==", - "optional": 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==", - "optional": true - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "@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==", "dev": true, "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" + "@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" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "@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==", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } + "@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", + "@xtuc/long": "4.2.2" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "@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==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "acorn": "^3.0.4" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true } } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", "dev": true }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "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=", + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "es6-promisify": "^5.0.0" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { - "callsite": "1.0.0" + "humanize-ms": "^1.2.1" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "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==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, "requires": { - "file-uri-to-path": "1.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "requires": { - "minimist": "^1.2.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" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "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==" }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "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 - } - } + "optional": true }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, + "angular2-virtual-scroll": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/angular2-virtual-scroll/-/angular2-virtual-scroll-0.4.16.tgz", + "integrity": "sha512-6NWk0DjCh4ebU8+LgfBoKYyp3McxDA/k5vTnEiV32VpVnyhN//eThZpVpggI1D2fJBqgTAY09C8v++qXHHLP7A==", "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" + "@tweenjs/tween.js": "^17.1.0" } }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "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": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" + "string-width": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -4621,1078 +3890,1217 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "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==", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "type-fest": "^0.11.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "ansi-wrap": "0.1.0" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "color-convert": "^1.9.0" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "browserify-des": { + "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==", + "dev": true + }, + "append-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "buffer-equal": "^1.0.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "default-require-extensions": "^2.0.0" } }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "dev": true, "requires": { - "pako": "~1.0.5" + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" } }, - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "make-iterator": "^1.0.0" } }, - "browserstack": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", - "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" }, "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.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==", + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, - "browserstack-local": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.5.tgz", - "integrity": "sha512-0/VdSv2YVXmcnwBb64XThMvjM1HnZJnPdv7CUgQbC5y/N9Wsr0Fu+j1oknE9fC/VPx9CpoSC6CJ0kza42skMSA==", + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { - "https-proxy-agent": "^4.0.0", - "is-running": "^2.1.0", - "ps-tree": "=1.2.0", - "temp-fs": "^0.9.9" + "is-number": "^4.0.0" }, "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { + "is-number": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, - "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==", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "array-uniq": "^1.0.1" } }, - "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==", + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "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=", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "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 - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "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" + } }, - "cacache": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", - "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" }, "dependencies": { - "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" - } + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "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" + "object-assign": "^4.1.1", + "util": "0.10.3" }, "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==", + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "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==", + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "inherits": "2.0.1" } } } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "callsites": "^2.0.0" + "lodash": "^4.17.14" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, "requires": { - "caller-callsite": "^2.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } }, - "caniuse-lite": { - "version": "1.0.30001039", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", - "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, - "canonical-path": { + "at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "autoprefixer": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" } }, - "chardet": { + "aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", "dev": true, "requires": { - "tslib": "^1.9.0" + "ast-types-flow": "0.0.7" } }, - "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", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", - "dev": true - }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } - } - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "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==", + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "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-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "object.assign": "^4.1.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, - "clone-buffer": { + "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "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=", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, - "clone-stats": { + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "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": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "tweetnacl": "^0.14.3" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "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==", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, - "codecov": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.7.0.tgz", - "integrity": "sha512-uIixKofG099NbUDyzRk1HdGtaG8O+PBUAg3wfmjwXw2+ek+PZp+puRvbTohqrVfuudaezivJHFgTtSC3M8MXww==", + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { - "argv": "0.0.2", - "ignore-walk": "3.0.3", - "js-yaml": "3.13.1", - "teeny-request": "6.0.1", - "urlgrey": "0.4.4" + "minimist": "^1.2.0" } }, - "codelyzer": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", - "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "app-root-path": "^2.2.1", - "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", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "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==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "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" } }, - "collection-visit": { + "boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "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==", + "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": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true + "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==", + "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==", + "dev": true + } + } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "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" + } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "mime-db": ">= 1.43.0 < 2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "pify": "^3.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "pako": "~1.0.5" } }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "connected-domain": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", - "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.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 + } } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "browserstack-local": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.5.tgz", + "integrity": "sha512-0/VdSv2YVXmcnwBb64XThMvjM1HnZJnPdv7CUgQbC5y/N9Wsr0Fu+j1oknE9fC/VPx9CpoSC6CJ0kza42skMSA==", + "dev": true, + "requires": { + "https-proxy-agent": "^4.0.0", + "is-running": "^2.1.0", + "ps-tree": "=1.2.0", + "temp-fs": "^0.9.9" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "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 }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true }, - "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", "dev": true, "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" + "chownr": "^1.1.2", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "unique-filename": "^1.1.1" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -5705,4578 +5113,7072 @@ "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "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" + } + } } }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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": { - "p-try": "^2.0.0" + "yallist": "^4.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==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "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=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "coverage-istanbul-loader": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", - "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "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": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.0", - "loader-utils": "^1.2.3", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.1" + "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": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "pump": "^3.0.0" } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "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 }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "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 + }, + "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": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "callsites": "^2.0.0" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "caller-callsite": "^2.0.0" } }, - "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" - } + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "crypto-random-string": { + "caniuse-lite": { + "version": "1.0.30001079", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001079.tgz", + "integrity": "sha512-2KaYheg0iOY+CMmDuAB3DHehrXhhb4OZU4KBVGDr/YKyYAcpudaiUQ9PJ9rxrPlKEoJ3ATasQ5AN48MqpwS43Q==", + "dev": true + }, + "canonical-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", "dev": true }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "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==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" - } - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "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": { - "through": "X.X.X" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "d3": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz", - "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", - "requires": { - "d3-array": "1.2.1", - "d3-axis": "1.0.8", - "d3-brush": "1.0.4", - "d3-chord": "1.0.4", - "d3-collection": "1.0.4", - "d3-color": "1.0.3", - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-dsv": "1.0.8", - "d3-ease": "1.0.3", - "d3-force": "1.1.0", - "d3-format": "1.2.2", - "d3-geo": "1.9.1", - "d3-hierarchy": "1.1.5", - "d3-interpolate": "1.1.6", - "d3-path": "1.0.5", - "d3-polygon": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-queue": "3.0.7", - "d3-random": "1.1.0", - "d3-request": "1.0.6", - "d3-scale": "1.0.7", - "d3-selection": "1.3.0", - "d3-shape": "1.2.0", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1", - "d3-timer": "1.0.7", - "d3-transition": "1.1.1", - "d3-voronoi": "1.1.2", - "d3-zoom": "1.7.1" - }, - "dependencies": { - "d3-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" - }, - "d3-brush": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", - "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", - "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" - }, - "d3-force": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", - "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", - "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" - }, - "d3-hierarchy": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", - "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY=" - }, - "d3-interpolate": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", - "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", - "requires": { - "d3-color": "1" - } - }, - "d3-selection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", - "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" - }, - "d3-shape": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", - "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", - "requires": { - "d3-path": "1" - } - }, - "d3-time-format": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", - "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.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": { - "d3-time": "1" + "is-glob": "^4.0.1" } } } }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", - "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, - "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==", + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "tslib": "^1.9.0" } }, - "d3-chord": { + "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/d3-chord/-/d3-chord-1.0.4.tgz", - "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { - "d3-array": "1", - "d3-path": "1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "d3-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true }, - "d3-dispatch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", - "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=" + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==" }, - "d3-drag": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", - "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, - "d3-dsv": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", - "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", + "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": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" + "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 + } } }, - "d3-ease": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", - "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" + "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 }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "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-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": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "restore-cursor": "^3.1.0" } }, - "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==" + "cli-spinners": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz", + "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==", + "dev": true }, - "d3-geo": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", - "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, "requires": { - "d3-array": "1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + } } }, - "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", - "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" - }, - "d3-polygon": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", - "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=" - }, - "d3-quadtree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", - "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=" - }, - "d3-queue": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", - "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg=" + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, - "d3-random": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", - "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=" + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true }, - "d3-request": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", - "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", + "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": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "d3-scale": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", - "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "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": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "mimic-response": "^1.0.0" } }, - "d3-selection": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", - "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, "requires": { - "d3-path": "1" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "d3-time": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, - "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==", + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, "requires": { - "d3-time": "1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" } }, - "d3-timer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", - "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + "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 }, - "d3-transition": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", - "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", + "codecov": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.7.0.tgz", + "integrity": "sha512-uIixKofG099NbUDyzRk1HdGtaG8O+PBUAg3wfmjwXw2+ek+PZp+puRvbTohqrVfuudaezivJHFgTtSC3M8MXww==", + "dev": true, "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "argv": "0.0.2", + "ignore-walk": "3.0.3", + "js-yaml": "3.13.1", + "teeny-request": "6.0.1", + "urlgrey": "0.4.4" } }, - "d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "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", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "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 + }, + "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 + } + } }, - "d3-zoom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", - "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "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": { - "assert-plus": "^1.0.0" + "color-name": "1.1.3" } }, - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, "requires": { - "ms": "2.0.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "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": { - "mimic-response": "^1.0.0" + "delayed-stream": "~1.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true }, - "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==", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "deepmerge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" - }, - "default-compare": { + "component-bind": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "mime-db": ">= 1.43.0 < 2" } }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { - "strip-bom": "^2.0.0" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" } }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "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==", + "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 }, - "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==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "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": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "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": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "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": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^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 - } + "semver": "^6.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "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 - }, - "delete": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/delete/-/delete-1.1.0.tgz", - "integrity": "sha512-bdhJatRNYsJnOhSRx9Eej3ABBtxQQw/uz2RprpYL5R3jCC2XMYVBcQWwvQLl+iNDk4LCLEKhdIP3uZSqRWi/tw==", + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { - "async-each": "^1.0.1", - "extend-shallow": "^2.0.1", - "matched": "^1.0.2", - "rimraf": "^2.6.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, - "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "connected-domain": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", + "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "detect-file": { + "constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "safe-buffer": "~5.1.1" } }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "path-type": "^3.0.0" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } } }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "dev": true, "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "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 }, - "domino": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.5.tgz", - "integrity": "sha512-vMDo7f6ogUV9PkzmxXLiXzJkJZqU09Le4C40mj+HmAGS/2FPmdetoNOQZXpu2kekn0GJKvtwKMAVoruTj60Xww==" - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "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 + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", + "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "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 }, - "electron-to-chromium": { - "version": "1.3.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz", - "integrity": "sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==" - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "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 } } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.3.tgz", - "integrity": "sha512-cbNhPFS6MlYlWTGncSiDYbdqKhwWFy7kNeb1YSOG6K65i/wPTkLVCJQj0hXA4j0m5Da+hBWnqopEnu1FFelisQ==", + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "once": "^1.4.0" + "postcss": "^7.0.1", + "timsort": "^0.3.0" } }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "css-loader": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", + "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "camelcase": "^5.3.1", + "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": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "minimist": "^1.2.0" } }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "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": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", "dev": true, "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } + "css": "^2.0.0" } }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "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==", + "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==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" - } - }, - "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==", - "requires": { - "stackframe": "^1.1.0" + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" } }, - "es-abstract": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", - "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.0.0", - "string.prototype.trimright": "^2.0.0" + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true }, - "es5-ext": { - "version": "0.10.51", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", - "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" + "through": "X.X.X" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "postcss": "^7.0.0" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "css-tree": "1.0.0-alpha.39" }, "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "mdn-data": "2.0.6", + "source-map": "^0.6.1" } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "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 } } }, - "es6-symbol": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", - "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.51" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "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==", "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, - "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=" + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "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==" + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "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==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "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-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==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "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", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "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", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" }, "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, - "eslint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", - "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "chalk": "^1.1.3", - "concat-stream": "^1.4.6", - "debug": "^2.1.1", - "doctrine": "^1.2.2", - "es6-map": "^0.1.3", - "escope": "^3.6.0", - "espree": "^3.1.6", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^1.1.1", - "glob": "^7.0.3", - "globals": "^9.2.0", - "ignore": "^3.1.2", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "optionator": "^0.8.1", - "path-is-absolute": "^1.0.0", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.6.0", - "strip-json-comments": "~1.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "strip-bom": "^3.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "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" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + } + } + }, + "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, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "kind-of": "^6.0.0" } }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" + "kind-of": "^6.0.0" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "once": "^1.3.0" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^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 + } } }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", - "dev": true - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } + "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 }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "delete": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/delete/-/delete-1.1.0.tgz", + "integrity": "sha512-bdhJatRNYsJnOhSRx9Eej3ABBtxQQw/uz2RprpYL5R3jCC2XMYVBcQWwvQLl+iNDk4LCLEKhdIP3uZSqRWi/tw==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "async-each": "^1.0.1", + "extend-shallow": "^2.0.1", + "matched": "^1.0.2", + "rimraf": "^2.6.1" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "path-type": "^3.0.0" } }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", "dev": true }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", - "dev": true + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "original": "^1.0.0" + "buffer-indexof": "^1.0.0" } }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "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" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "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==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "domino": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.5.tgz", + "integrity": "sha512-vMDo7f6ogUV9PkzmxXLiXzJkJZqU09Le4C40mj+HmAGS/2FPmdetoNOQZXpu2kekn0GJKvtwKMAVoruTj60Xww==" + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } + "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 } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "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", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "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 - } + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "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" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "iconv-lite": "~0.4.13" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": { - "is-extendable": "^0.1.0" + "ms": "2.0.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, "requires": { - "kind-of": "^6.0.0" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "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": { - "kind-of": "^6.0.0" + "ms": "2.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "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==", "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" } }, - "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==", + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz", + "integrity": "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==", "dev": true }, - "fastparse": { + "err-code": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", "dev": true }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "reusify": "^1.0.4" + "prr": "~1.0.1" } }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "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": { - "websocket-driver": ">=0.5.1" + "is-arrayish": "^0.2.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "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==", + "requires": { + "stackframe": "^1.1.0" + } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" } }, - "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "file-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", - "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "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" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - } + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" } }, - "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==", - "optional": true + "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 }, - "fileset": { + "es6-iterator": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" } }, - "find-cache-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", - "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" }, "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" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "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 - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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==", + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "find-up": "^4.0.0" + "d": "1", + "es5-ext": "~0.10.14" } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, "requires": { - "locate-path": "^2.0.0" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "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==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" }, "dependencies": { - "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" - } - }, - "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" - } + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true }, - "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" - } + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "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=", + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, + "optional": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "amdefine": ">=0.0.4" } } } }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "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" - } - } + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "es6-map": "^0.1.3", + "escope": "^3.6.0", + "espree": "^3.1.6", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.1.2", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "optionator": "^0.8.1", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.6.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "glob": "^7.1.3" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" } + }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "follow-redirects": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", - "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "debug": "^3.0.0" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true } } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "for-in": "^1.0.1" + "estraverse": "^4.1.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "fork-ts-checker-webpack-plugin": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.15.tgz", - "integrity": "sha512-qNYuygh2GxXehBvQZ5rI5YlQFn+7ZV6kmkyD9Sgs33dWl73NZdUOB5aCp8v0EXJn176AhPrZP8YCMT3h01fs+g==", - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^2.0.4", - "lodash": "^4.17.11", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "resolve": "^1.5.0", - "tapable": "^1.0.0" - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "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 }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "d": "1", + "es5-ext": "~0.10.14" } }, - "front-matter": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz", - "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=", + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "js-yaml": "^3.4.6" + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, - "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" - } + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" + "original": "^1.0.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "fs.realpath": { + "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "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, + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "is-property": "^1.0.0" + "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" } }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "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==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "pump": "^3.0.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "is-descriptor": "^0.1.0" } - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "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=", + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extendable": "^0.1.0" } } } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "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": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" + "homedir-polyfill": "^1.0.1" } }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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 + } } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "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": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "path-type": "^4.0.0" + "is-extendable": "^0.1.0" } }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { - "sparkles": "^1.0.0" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" } }, - "gonzales-pe-sl": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz", - "integrity": "sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=", + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", "dev": true, "requires": { - "minimist": "1.1.x" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" }, "dependencies": { - "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", - "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", - "dev": true + "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" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } } } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "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" + "reusify": "^1.0.4" } }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, "requires": { - "lodash": "^4.17.15" + "websocket-driver": ">=0.5.1" } }, - "graphviz": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/graphviz/-/graphviz-0.0.8.tgz", - "integrity": "sha1-5ZnkBzPvgOFlO/6JpfAx7PKqSqo=", + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "temp": "~0.4.0" + "escape-string-regexp": "^1.0.5" } }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", "dev": true, "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - } + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, - "gulp-zip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.1.tgz", - "integrity": "sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==", + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", "dev": true, "requires": { - "get-stream": "^5.1.0", - "plugin-error": "^1.0.1", - "through2": "^3.0.1", - "vinyl": "^2.1.0", - "yazl": "^2.5.1" + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" }, "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==", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "pump": "^3.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" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { - "readable-stream": "2 || 3" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" } } } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "handlebars": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.0.tgz", - "integrity": "sha512-7XlnO8yBXOdi7AzowjZssQr47Ctidqm7GbgARapOaqSN9HQhlClnOkR9HieGauIT3A8MBC6u9wPCXs97PCYpWg==", + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, - "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.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "to-regex-range": "^5.0.1" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { - "isarray": "2.0.1" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "dev": true, - "requires": { - "is-glob": "^3.0.0" - }, - "dependencies": { - "is-glob": { + "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" + } + }, + "make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "semver": "^6.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": "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 + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "locate-path": "^2.0.0" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "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": { - "is-buffer": "^1.1.5" + "homedir-polyfill": "^1.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" + } + }, + "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" } } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "glob": "^7.1.3" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "readable-stream": "^2.3.6" } }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "for-in": "^1.0.1" } }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "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", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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" + } + }, + "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 + }, + "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 + }, + "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" + } } } }, - "http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "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": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "map-cache": "^0.2.2" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "http-signature": { + "fromentries": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "front-matter": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz", + "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "js-yaml": "^3.4.6" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "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==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "ms": "^2.1.1" + "graceful-fs": "^4.1.6", + "universalify": "^1.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==", + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true } } }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { - "ms": "^2.0.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "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" + } + } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "is-property": "^1.0.2" } }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "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" + } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, - "immer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/immer/-/immer-4.0.2.tgz", - "integrity": "sha512-Q/tm+yKqnKy4RIBmmtISBlhXuSDrB69e9EKTYiIenIKQkXBQir43w+kN/eGiax3wt1J0O1b2fYcNqLSbEcXA7w==" + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, + "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "import-from": "^2.1.0" + "pump": "^3.0.0" } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "assert-plus": "^1.0.0" } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "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" } }, - "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", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "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": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "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" + } + } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "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 - }, - "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.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 - }, - "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 + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } }, - "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==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, "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==", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true } } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "intersect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", - "integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "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==", + "dev": true, "requires": { - "loose-envify": "^1.0.0" + "ini": "^1.3.5" } }, - "invert-kv": { + "global-modules": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true + "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" + } }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "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": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "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 }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, "requires": { - "kind-of": "^3.0.2" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { - "is-buffer": "^1.1.5" + "path-type": "^4.0.0" } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true } } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "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": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "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==", + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "sparkles": "^1.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "gonzales-pe-sl": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz", + "integrity": "sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=", + "dev": true, "requires": { - "kind-of": "^3.0.2" + "minimist": "1.1.x" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true } } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "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==", + "dev": true + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" }, "dependencies": { - "kind-of": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + } + } + }, + "gulp-zip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.1.tgz", + "integrity": "sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==", + "dev": true, + "requires": { + "get-stream": "^5.1.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "dependencies": { + "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==" + }, + "get-stream": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "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=" + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.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 + } + } }, - "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==", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "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=", + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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": { - "is-extglob": "^2.1.1" + "function-bind": "^1.1.1" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "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 + }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", "dev": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "is-glob": "^3.0.0" }, "dependencies": { - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "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" + } + } + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.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==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "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" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.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" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "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.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "immer": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/immer/-/immer-6.0.9.tgz", + "integrity": "sha512-SyCYnAuiRf67Lvk0VkwFvwtDoEiCMjeamnHvRfnVDyc7re1/rQrNxuL+jJ7lA3WvdC4uznrvbmm+clJ9+XXatg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "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", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "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 + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "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==", + "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" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", + "integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww=" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "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" + }, + "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==" + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "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", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "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", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "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 + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": 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" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "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": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz", + "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==", + "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 + } + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-running": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", + "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "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" + } + }, + "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", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "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" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "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 + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 + }, + "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" + } + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.1.tgz", + "integrity": "sha512-RrOZ+bSPnbk1/9KKs5lm0Nl0cqDCh/XXVlCmu3nkhEJH6HTDh4hoJZu3q8e9aq37C0eXEf/JEJnYy+t4m3arZQ==", + "dev": true, + "requires": { + "colors": "1.4.0" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + } + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "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==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-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" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-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==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": 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" + } + }, + "jszip": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.3.0.tgz", + "integrity": "sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "karma": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.1.tgz", + "integrity": "sha512-xrDGtZ0mykEQjx1BUHOP1ITi39MDsCGocmSvLJWHxUQpxuKwxk3ZUrC6HI2VWh1plLC6+7cA3B19m12yzO/FRw==", + "dev": true, + "requires": { + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^4.0.2", + "lodash": "^4.17.14", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "ua-parser-js": "0.7.21", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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 + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-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" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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 + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "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", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "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 - }, - "is-my-json-valid": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", - "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { - "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" + "which": "^1.2.1" } }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true + "karma-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", + "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", + "dev": true, + "requires": { + "resolve": "^1.3.3" + } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, "requires": { - "kind-of": "^3.0.2" + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, "requires": { - "is-buffer": "^1.1.5" + "default-require-extensions": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==" + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "istanbul-api": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", + "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.5", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.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" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.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 + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true } } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz", - "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==", - "dev": true, - "requires": { - "@types/estree": "0.0.44" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "karma-jasmine": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.1.1.tgz", + "integrity": "sha512-pxBmv5K7IkBRLsFSTOpgiK/HzicQT3mfFF+oHAC7nxMfYKhaYFgxOa5qjnHW4sL5rUnmdkSajoudOnnOdPyW4Q==", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "jasmine-core": "^3.5.0" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "karma-jasmine-html-reporter": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz", + "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==", "dev": true }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "source-map-support": "^0.5.5" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "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" + } }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "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": { - "unc-path-regex": "^0.1.2" + "json-buffer": "3.0.0" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "klaw-sync": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-2.1.0.tgz", + "integrity": "sha1-PTvNhgDnv971MjHHOf8FOu1WDkQ=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } }, - "is-yarn-global": { + "known-css-properties": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.3.0.tgz", + "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { - "buffer-alloc": "^1.2.0" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "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": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } + "package-json": "^6.3.0" } }, - "istanbul-api": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.2.tgz", - "integrity": "sha512-kH5YRdqdbs5hiH4/Rr1Q0cSAGgjh3jTtg8vu9NLebBAoK3adVO4jk81J+TYOkTr2+Q4NLeb1ACvmEt65iG/Vbw==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.9.2", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.1.4", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" - } - } + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" } }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "append-transform": "^0.4.0" + "invert-kv": "^1.0.0" } }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "flush-write-stream": "^1.0.2" } }, - "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "less": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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, - "requires": { - "has-flag": "^1.0.0" - } + "optional": true } } }, - "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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": { - "ms": "^2.1.1" + "minimist": "^1.2.0" } }, - "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "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==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, - "istanbul-reports": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "leven": "^3.1.0" } }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true + "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==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } }, - "jasmine-marbles": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz", - "integrity": "sha512-1uzgjEesEeCb+r+v46qn5x326TiGqk5SUZa+A3O+XnMCjG/pGcUOhL9Xsg5L7gLC6RFHyWGTkB5fei4rcvIOiQ==", + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, "requires": { - "lodash": "^4.5.0" + "immediate": "~3.0.5" } }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { - "colors": "1.1.2" + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "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": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=" + } } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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==" + } + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "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==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "jsonify": "~0.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "json-stable-stringify-without-jsonify": { + "lowercase-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "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 + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, "requires": { - "minimist": "^1.2.5" + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "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", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "kind-of": "^6.0.2" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "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 }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "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==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "object-visit": "^1.0.0" } }, - "jszip": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.3.0.tgz", - "integrity": "sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } + "mappy-breakpoints": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/mappy-breakpoints/-/mappy-breakpoints-0.2.3.tgz", + "integrity": "sha1-55ZqFe6louprSJXSW364It199Fs=" }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true + "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==" }, - "karma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz", - "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==", + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", - "core-js": "^3.1.3", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "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 - }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -10285,75 +12187,76 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.4.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=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "findup-sync": { + "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 + }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, "optional": true }, "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" - } + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "binary-extensions": "^2.0.0" + "is-extglob": "^2.1.0" } }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "mime": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", + "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==" }, "readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -10361,2548 +12264,3308 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } } } }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "matched": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", + "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", "dev": true, "requires": { - "which": "^1.2.1" + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.1", + "glob": "^7.1.2", + "has-glob": "^1.0.0", + "is-valid-glob": "^1.0.0", + "resolve-dir": "^1.0.0" } }, - "karma-cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", - "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "resolve": "^1.3.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "karma-coverage-istanbul-reporter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", - "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.0.tgz", + "integrity": "sha512-RlbnLQgRHk5lwqTtpEkBTQ2ll/CG/iB+J4Hy2Wh97PjgZgXgWJWrFF+XXujh3UUVLvR4OOTgZzcWMMwnehlEUg==", "dev": true, "requires": { - "istanbul-api": "^2.1.6", - "minimatch": "^3.0.4" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.0.0" }, "dependencies": { - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "istanbul-api": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", - "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", - "dev": true, - "requires": { - "async": "^2.6.2", - "compare-versions": "^3.4.0", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.5", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "mimic-fn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", + "integrity": "sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ==", "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + } + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, - "karma-jasmine": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", - "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "jasmine-core": "^3.3" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "karma-jasmine-html-reporter": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz", - "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==", + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true }, - "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=", + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "colors": "^1.1.2" + "mime-db": "1.43.0" } }, - "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" - } + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "killable": { + "mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "klaw-sync": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-2.1.0.tgz", - "integrity": "sha1-PTvNhgDnv971MjHHOf8FOu1WDkQ=", + "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==", "dev": true, "requires": { - "graceful-fs": "^4.1.11" + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^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==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, - "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==", + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "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" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "flush-write-stream": "^1.0.2" + "brace-expansion": "^1.1.7" } }, - "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "less-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", - "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "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": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, - "less-plugin-npm-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", - "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { - "promise": "~7.0.1", - "resolve": "~1.1.6" + "minipass": "^3.0.0" }, "dependencies": { - "promise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "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": { - "asap": "~2.0.3" + "yallist": "^4.0.0" } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true } } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "license-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", - "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", - "dev": true, - "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "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=", + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "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" + "minipass": "^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 + "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" + } } } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "minipass": "^3.0.0" }, "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==", + "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": { - "minimist": "^1.2.0" + "yallist": "^4.0.0" } } } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", "dev": true, "requires": { - "date-format": "^2.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.0", - "rfdc": "^1.1.4", - "streamroller": "^1.0.6" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "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": { - "ms": "^2.1.1" + "yallist": "^4.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 } } }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "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", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, - "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==", + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "minimist": "0.0.8" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true } } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "mktemp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mktemp/-/mktemp-1.0.0.tgz", + "integrity": "sha512-2duBeS0A75x0M3sCoY0R1TiLsYfIBUtNBNWS++eo+bX/ObVqzblqnEQhlaepoBOLD14wklsV3cYxZ68o5qYO8A==", "dev": true }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "moment": ">= 2.9.0" } }, - "make-iterator": { + "move-concurrently": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "kind-of": "^6.0.2" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "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==", + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "requires": { - "object-visit": "^1.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, - "mappy-breakpoints": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/mappy-breakpoints/-/mappy-breakpoints-0.2.3.tgz", - "integrity": "sha1-55ZqFe6louprSJXSW364It199Fs=" + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true }, - "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "ng-packagr": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-9.1.5.tgz", + "integrity": "sha512-biuNfM15uLkCW+Vvj8bnuwjX37oX7j5icGm+l71FhM6ydlEl+Cl7PdFXpy9rrIlKFYlYRiPiiiWazGwVGn1icQ==", "dev": true, "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" + "@rollup/plugin-commonjs": "^11.0.2", + "@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", + "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": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "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==", + "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 + }, + "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": { - "homedir-polyfill": "^1.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" } }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "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": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "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": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "glob": "^7.1.3" } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "rollup": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.7.5.tgz", + "integrity": "sha512-xQSM8uzhgtF6tTnTVEvOQThrcG3LPUP3T/4l4EukzDp0kbTY1QRDuXjiwtYzs9odKj9Bj/PccRG6viFfS7DmCQ==", "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" + "fsevents": "~2.1.2" } }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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": { - "is-extglob": "^2.1.0" + "@rollup/pluginutils": "^3.0.9", + "source-map-resolve": "^0.6.0" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "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": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } + }, + "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 } } }, - "matched": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", - "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", - "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==", "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.1", - "glob": "^7.1.2", - "has-glob": "^1.0.0", - "is-valid-glob": "^1.0.0", - "resolve-dir": "^1.0.0" + "deepmerge": "^3.2.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, + "ngx-moment": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ngx-moment/-/ngx-moment-3.5.0.tgz", + "integrity": "sha512-QC/5XNC0BW6WkJkwZT4r2A29j/8sJAmhuQJrEnEdpW35GvkemccuxEUAwo/PwkzPB/CHaquR00E6P2HVEQ1iEg==", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "tslib": "^1.9.0" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, - "mem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", - "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" } }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "source-map": "^0.6.1" + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "process-on-spawn": "^1.0.0" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "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==", "dev": true }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { - "mime-db": "1.43.0" + "find-parent-dir": "^0.3.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 + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } }, - "mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "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": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "normalizr": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.0.tgz", + "integrity": "sha512-25cd8DiDu+pL46KIaxtVVvvEPjGacJgv0yUg950evr62dQ/ks2JO1kf7+Vi5/rMFjaSTSTls7aCnmRlUSljtiA==" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "once": "^1.3.2" } }, - "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==", + "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": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "npm-normalize-package-bin": "^1.0.1" } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", "dev": true, "requires": { - "minipass": "^2.9.0" + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "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-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" }, "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "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==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "lru-cache": "^5.1.1" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", + "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "npm-registry-fetch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz", + "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==", + "dev": true, "requires": { - "minimist": "0.0.8" + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, - "mktemp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mktemp/-/mktemp-1.0.0.tgz", - "integrity": "sha512-2duBeS0A75x0M3sCoY0R1TiLsYfIBUtNBNWS++eo+bX/ObVqzblqnEQhlaepoBOLD14wklsV3cYxZ68o5qYO8A==", - "dev": true - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "moment-timezone": { - "version": "0.5.28", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", - "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, "requires": { - "moment": ">= 2.9.0" + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.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" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "path-key": "^2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "boolbase": "~1.0.0" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "mute-stdout": { + "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "ng-packagr": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.7.1.tgz", - "integrity": "sha512-NDAUcMtLyZnF3bP6JtC3ANpIQRclRDPilF7C0DsjQuIz1q0V3mT7f1PwV0jnRWy8iRpSZmJZr6AGl736gloHtQ==", + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { - "ajv": "^6.10.2", - "autoprefixer": "^9.6.0", - "browserslist": "^4.0.0", - "chalk": "^2.3.1", - "chokidar": "^3.0.0", - "clean-css": "^4.1.11", - "commander": "^3.0.0", - "fs-extra": "^8.0.0", - "glob": "^7.1.2", - "injection-js": "^2.2.1", - "less": "^3.8.0", - "less-plugin-npm-import": "^2.1.0", - "node-sass-tilde-importer": "^1.0.0", - "postcss": "^7.0.0", - "postcss-url": "^8.0.0", - "read-pkg-up": "^5.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", "rimraf": "^3.0.0", - "rollup": "1.25.2", - "rollup-plugin-commonjs": "^10.0.0", - "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-resolve": "^5.0.0", - "rollup-plugin-sourcemaps": "^0.4.2", - "rxjs": "^6.0.0", - "sass": "^1.17.3", - "stylus": "^0.54.5", - "terser": "^4.1.2", - "update-notifier": "^3.0.0" + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "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" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "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": "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "p-limit": "^2.2.0" } }, - "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==", + "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 }, - "braces": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "glob": "^7.1.3" } }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.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 }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "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 }, - "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==", + "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": { - "to-regex-range": "^5.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": { - "locate-path": "^3.0.0" + "ansi-regex": "^5.0.0" } }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true }, - "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==", + "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": { - "is-glob": "^4.0.1" + "has-flag": "^4.0.0" } }, - "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==", + "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", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "binary-extensions": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.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==", + } + } + }, + "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=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "is-descriptor": "^0.1.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 - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "is-buffer": "^1.1.5" } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "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==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "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==", "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" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, - "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==", + "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": { - "find-up": "^3.0.0", - "read-pkg": "^5.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "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.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "picomatch": "^2.2.1" + "has-symbols": "^1.0.1" } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "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==", + "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": { - "glob": "^7.1.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "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": { - "is-number": "^7.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } - }, - "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": "8.0.0", - "resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-8.0.0.tgz", - "integrity": "sha512-3AHqw1AeXDXU/Hgxlh5fjP/srgGuP8BJR2uQ6ViGLeKwMEQDZuQfwd8zu9+bPZcvIxbAcxjWoGCVJXYEkBlxmg==", - "requires": { - "deepmerge": "^3.2.0" - } - }, - "ngx-moment": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ngx-moment/-/ngx-moment-3.5.0.tgz", - "integrity": "sha512-QC/5XNC0BW6WkJkwZT4r2A29j/8sJAmhuQJrEnEdpW35GvkemccuxEUAwo/PwkzPB/CHaquR00E6P2HVEQ1iEg==", - "requires": { - "tslib": "^1.9.0" - } - }, - "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-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "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 }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "isobject": "^3.0.0" } }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" - }, - "node-sass-tilde-importer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", - "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "find-parent-dir": "^0.3.0" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "abbrev": "1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.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==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-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.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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==", + "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" + } + } } }, - "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==", + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "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" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "isobject": "^3.0.1" } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "normalizr": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.0.tgz", - "integrity": "sha512-25cd8DiDu+pL46KIaxtVVvvEPjGacJgv0yUg950evr62dQ/ks2JO1kf7+Vi5/rMFjaSTSTls7aCnmRlUSljtiA==" - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { - "once": "^1.3.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "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==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-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.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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==", + "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" + } + } } }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "ee-first": "1.1.1" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, - "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" + "mimic-fn": "^2.1.0" } }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "open": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } } }, - "npm-registry-fetch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz", - "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true } } }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "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": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "color-name": "~1.1.4" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "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 + }, + "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": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "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 + "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" + } } } }, - "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=", + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "path-key": "^2.0.0" + "readable-stream": "^2.0.1" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } }, - "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=", + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "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==", + "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 }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "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 }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "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=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.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=" + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "package-json": { + "version": "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": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "is-descriptor": "^0.1.0" + "minimist": "^1.2.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": { - "is-buffer": "^1.1.5" + "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 } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "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==", + "pacote": { + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "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==", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "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==", + "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": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "minipass": "^2.6.0" } }, - "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.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "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" + } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { - "has": "^1.0.3" + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" } }, - "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==", - "dev": true + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } }, - "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==", + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "figgy-pudding": "^3.5.1" } }, - "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==", + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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==" + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, - "object-visit": { + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "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=" + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { - "isobject": "^3.0.0" + "pify": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "through": "~2.3" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "object.getownpropertydescriptors": { + "performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "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==" + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" }, "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==", + "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": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "locate-path": "^3.0.0" } }, - "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==", + "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": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "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.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "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": { - "has": "^1.0.3" + "p-try": "^2.0.0" } }, - "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==", - "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==", + "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": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "p-limit": "^2.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" - } + "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 } } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "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": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" + "find-up": "^2.1.0" } }, - "object.reduce": { + "plugin-error": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "ee-first": "1.1.1" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "portfinder": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { - "wrappy": "1" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { - "is-wsl": "^1.1.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 + } } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "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 } } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "postcss": "^7.0.0" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "url-parse": "^1.4.3" + "postcss": "^7.0.0" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "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-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "lcid": "^1.0.0" + "postcss": "^7.0.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "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==", - "requires": { - "p-try": "^1.0.0" + "postcss": "^7.0.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, "requires": { - "p-limit": "^1.1.0" + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "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 + } } }, - "p-map": { + "postcss-load-config": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "dev": true, "requires": { - "retry": "^0.12.0" + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.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=" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, - "pacote": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", - "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.8", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { - "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-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 + } } }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "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 + } } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "error-ex": "^1.2.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-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==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } } }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "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 - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dev": true, "requires": { - "better-assert": "~1.0.0" + "postcss": "^7.0.5" } }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", "dev": true, "requires": { - "better-assert": "~1.0.0" + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { + "postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, "requires": { - "pify": "^3.0.0" + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" } }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "through": "~2.3" + "postcss": "^7.0.0" } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "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==", - "dev": true - }, - "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } + } }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-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 + } + } }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, "requires": { - "find-up": "^3.0.0" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "find-up": { @@ -12942,108 +15605,113 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "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 } } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, "requires": { - "find-up": "^2.1.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.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 } } }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "portfinder": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", - "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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 } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.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==", + "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 } } }, - "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -13054,26 +15722,46 @@ } } }, - "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==", + "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==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "loader-utils": "^1.1.0", + "is-svg": "^3.0.0", "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "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 + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" } }, "postcss-url": { @@ -13112,14 +15800,7 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pretty-hrtime": { "version": "1.0.3", @@ -13130,7 +15811,8 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, "process": { "version": "0.11.10", @@ -13141,7 +15823,17 @@ "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==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } }, "progress": { "version": "1.1.8", @@ -13341,6 +16033,49 @@ } } }, + "protractor-console": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/protractor-console/-/protractor-console-3.0.0.tgz", + "integrity": "sha512-2BTh751CMjEAMxuZXb86jvs0TDWjvCk7fCnKTyb5vX/KE5f+olTeVCmcFm+4Aretpc6q/6yryuSJ8wjgL9QTKw==", + "dev": true, + "requires": { + "chalk": "^1.1.0", + "lodash": "^3.10.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -13354,7 +16089,8 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true }, "ps-node": { "version": "0.1.6", @@ -13374,12 +16110,6 @@ "event-stream": "=3.3.4" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -13409,10 +16139,9 @@ } }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13427,6 +16156,18 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { @@ -13434,6 +16175,15 @@ "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", @@ -13456,7 +16206,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, "requires": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" @@ -13526,36 +16275,33 @@ } }, "raw-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", - "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "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.1.0", - "schema-utils": "^2.0.1" + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" }, "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "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" + "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" } }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "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": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -13678,6 +16424,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13701,13 +16448,12 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "readline2": { @@ -13747,12 +16493,14 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, "requires": { "regenerate": "^1.4.0" } @@ -13760,12 +16508,14 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true }, "regenerator-transform": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, "requires": { "@babel/runtime": "^7.8.4", "private": "^0.1.8" @@ -13775,6 +16525,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -13827,18 +16578,18 @@ "dev": true }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "object-inspect": { @@ -13875,6 +16626,7 @@ "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", @@ -13905,12 +16657,14 @@ "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true }, "regjsparser": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -13918,10 +16672,20 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true } } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -13946,26 +16710,20 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "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" - } + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "replace-ext": { "version": "1.0.0", @@ -13985,12 +16743,12 @@ } }, "replace-in-file": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-4.3.1.tgz", - "integrity": "sha512-FqVvfmpqGTD2JRGI1JjJ86b24P17x/WWwGdxExeyJxnh/2rVQz2+jXfD1507UnnhEQw092X0u0DPCBf1WC4ooQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-5.0.2.tgz", + "integrity": "sha512-1Vc7Sbr/rTuHgU1PZuBb7tGsFx3D4NKdhV4BpEF2MuN/6+SoXcFtx+dZ1Zz+5Dq4k5x9js87Y+gXQYPTQ9ppkA==", "dev": true, "requires": { - "chalk": "^2.4.2", + "chalk": "^3.0.0", "glob": "^7.1.6", "yargs": "^15.0.2" }, @@ -14011,6 +16769,16 @@ "color-convert": "^2.0.1" } }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -14047,26 +16815,12 @@ "path-exists": "^4.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "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 }, - "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" - } - }, "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", @@ -14112,12 +16866,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -14138,6 +16886,15 @@ "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" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -14237,19 +16994,12 @@ "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-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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 }, "require-uncached": { @@ -14300,6 +17050,7 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -14341,7 +17092,8 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, "responselike": { "version": "1.0.2", @@ -14365,7 +17117,8 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "retry": { "version": "0.12.0", @@ -14385,6 +17138,18 @@ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -14405,68 +17170,12 @@ } }, "rollup": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", - "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", - "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", - "dev": true, - "requires": { - "rollup-pluginutils": "^2.5.0" - } - }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "dev": true, - "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-sourcemaps": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", - "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", - "dev": true, - "requires": { - "rollup-pluginutils": "^2.0.1", - "source-map-resolve": "^0.5.0" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", + "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "fsevents": "~2.1.2" } }, "run-async": { @@ -14490,11 +17199,6 @@ "aproba": "^1.1.1" } }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, "rx-lite": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", @@ -14746,12 +17450,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, "requires": { "ret": "~0.1.10" } @@ -14759,12 +17465,13 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sass": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", - "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz", + "integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -14830,22 +17537,42 @@ } }, "sass-loader": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", - "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "dev": true, "requires": { "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", - "semver": "^5.5.0" + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -14902,14 +17629,28 @@ "dev": true }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "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" + } + } } }, "select-hose": { @@ -14956,12 +17697,20 @@ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "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": "^5.0.3" + "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 + } } }, "semver-dsl": { @@ -15082,8 +17831,7 @@ "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 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-immediate-shim": { "version": "1.0.1", @@ -15095,6 +17843,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -15106,6 +17855,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -15147,7 +17897,6 @@ "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" } @@ -15155,8 +17904,7 @@ "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 + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { "version": "1.7.2", @@ -15167,8 +17915,24 @@ "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 + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } }, "slash": { "version": "1.0.0", @@ -15192,6 +17956,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -15207,6 +17972,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -15215,6 +17981,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -15225,6 +17992,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -15235,6 +18003,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -15243,6 +18012,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -15251,6 +18021,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -15259,6 +18030,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -15271,6 +18043,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -15279,6 +18052,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -15390,13 +18164,22 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -15474,7 +18257,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, "requires": { "is-plain-obj": "^1.0.0" } @@ -15498,14 +18280,37 @@ "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==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -15513,9 +18318,9 @@ } }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "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", @@ -15533,7 +18338,8 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true }, "sourcemap-codec": { "version": "1.4.8", @@ -15546,6 +18352,55 @@ "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + } + } + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -15672,6 +18527,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -15700,14 +18556,31 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "minipass": "^3.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==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -15732,6 +18605,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -15741,6 +18615,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -15759,14 +18634,6 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stratos-angular6-json-schema-form": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/stratos-angular6-json-schema-form/-/stratos-angular6-json-schema-form-7.0.6.tgz", - "integrity": "sha512-S/yasSZ+1YNPsiTARCqaPOW8+5ob+9jfOO0XxJ/myDlSTtgoNb4nGnl3LWlEFwMUWiOjkOUVyyVlBsiK5vIBTg==", - "requires": { - "tslib": "^1.9.0" - } - }, "stratos-protractor-reporter": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stratos-protractor-reporter/-/stratos-protractor-reporter-1.2.3.tgz", @@ -15872,9 +18739,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "streamroller": { @@ -15921,8 +18788,7 @@ "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { "version": "1.0.2", @@ -15993,18 +18859,18 @@ "dev": true }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "object-inspect": { @@ -16104,18 +18970,18 @@ "dev": true }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "object-inspect": { @@ -16152,6 +19018,7 @@ "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" } @@ -16160,6 +19027,7 @@ "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" } @@ -16176,8 +19044,7 @@ "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 + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-json-comments": { "version": "2.0.1", @@ -16192,82 +19059,112 @@ "dev": true }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", "dev": true, "requires": { "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" + "schema-utils": "^2.6.4" }, "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "minimist": "^1.2.0" } }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "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": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "css-parse": "1.7.x", - "debug": "*", - "glob": "7.0.x", - "mkdirp": "0.5.x", - "sax": "0.5.x", - "source-map": "0.1.x" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "stylus": { + "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.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "ms": "2.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -16280,6 +19177,28 @@ "loader-utils": "^1.0.2", "lodash.clonedeep": "^4.5.0", "when": "~3.6.x" + }, + "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" + } + } } }, "supports-color": { @@ -16301,6 +19220,27 @@ "es6-symbol": "^3.1.1" } }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -16409,21 +19349,44 @@ "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", "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" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "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 + }, + "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 + } } }, "teeny-request": { @@ -16494,12 +19457,6 @@ } } }, - "temp": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.4.0.tgz", - "integrity": "sha1-ZxrWPVe+D+nXKUZks/xABjZnimA=", - "dev": true - }, "temp-fs": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", @@ -16521,68 +19478,15 @@ } }, "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } + "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.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", + "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -16599,41 +19503,101 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" }, "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "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 + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16687,6 +19651,12 @@ "setimmediate": "^1.0.4" } }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -16721,12 +19691,14 @@ "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=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -16735,6 +19707,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -16751,6 +19724,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -16759,12 +19733,12 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "to-through": { @@ -16803,113 +19777,33 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "ts-loader": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.1.tgz", - "integrity": "sha512-fDDgpBH3SR8xlt2MasLdz3Yy611PQ/UY/KGyo7TgXhTRU/6sS8uGG0nJYnU1OdFBNKcoYbId1UTNaAOUn+i41g==", - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.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==", - "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" - } - } - } - }, "ts-md5": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.7.tgz", "integrity": "sha512-emODogvKGWi1KO1l9c6YxLMBn6CEH3VrH5mVPIyOtxBG52BvV4jP3GWz6bOZCz61nLgBc3ffQYE4+EHfCD+V7w==" }, "ts-node": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", - "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.2.tgz", + "integrity": "sha512-duVj6BpSpUpD/oM4MfhO98ozgkp3Gt9qIp3jGxwU2DFvl/3IRaEAvbLa8G60uS7C77457e/m5TMowjedeRxI1Q==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", - "yn": "^3.0.0" - } - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.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" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } - }, - "tsconfig-paths-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==", - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "tsconfig-paths": "^3.4.0" + "yn": "3.1.1" } }, - "tsickle": { - "version": "0.37.1", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.37.1.tgz", - "integrity": "sha512-0GwgOJEnsmRsrONXCvcbAWY0CvdqF3UugPVoupUpA8Ul0qCPTuqqq0ou/hLqtKZOyyulzCP6MYRjb9/J1g9bJg==", - "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==" }, "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -16920,10 +19814,10 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.10.0", "tsutils": "^2.29.0" }, "dependencies": { @@ -16932,6 +19826,15 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -17002,27 +19905,41 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "commander": "~2.20.3" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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 } @@ -17072,12 +19989,14 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" @@ -17086,17 +20005,20 @@ "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -17104,6 +20026,18 @@ "set-value": "^2.0.1" } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -17133,12 +20067,12 @@ } }, "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "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": "^1.0.0" + "crypto-random-string": "^2.0.0" } }, "universal-analytics": { @@ -17181,10 +20115,17 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -17194,6 +20135,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -17204,6 +20146,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -17213,33 +20156,88 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true }, "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "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": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", + "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.1.0", - "is-npm": "^3.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.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": { @@ -17253,7 +20251,8 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url": { "version": "0.11.0", @@ -17309,7 +20308,8 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "user-home": { "version": "2.0.0", @@ -17320,34 +20320,6 @@ "os-homedir": "^1.0.0" } }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -17368,7 +20340,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "util-promisify": { "version": "2.1.0", @@ -17379,6 +20352,99 @@ "object.getownpropertydescriptors": "^2.0.3" } }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-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.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "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==", + "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" + } + } + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -17391,15 +20457,6 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -17431,6 +20488,12 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -17502,14 +20565,19 @@ "now-and-later": "^2.0.0", "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, - "viz.js": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", - "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", - "dev": true - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -17681,6 +20749,129 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" } }, "normalize-path": { @@ -17689,6 +20880,17 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "optional": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -17701,6 +20903,15 @@ "minimalistic-assert": "^1.0.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" + } + }, "web-animations-js": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", @@ -17728,9 +20939,9 @@ } }, "webpack": { - "version": "4.39.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", - "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -17753,7 +20964,7 @@ "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" }, @@ -17764,6 +20975,80 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "glob": { + "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" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "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.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" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -17773,32 +21058,59 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + } } } } @@ -17835,9 +21147,9 @@ } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -17848,39 +21160,78 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.4", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -17902,34 +21253,61 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "ms": "^2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, "find-up": { @@ -17941,25 +21319,50 @@ "locate-path": "^3.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.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 }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" } }, "locate-path": { @@ -17972,40 +21375,12 @@ "path-exists": "^3.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" - } - }, "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 }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -18030,6 +21405,28 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "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", @@ -18037,26 +21434,37 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -18064,29 +21472,27 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -18106,19 +21512,14 @@ } }, "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "requires": { - "lodash": "^4.17.5" + "lodash": "^4.17.15" } }, - "webpack-node-externals": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", - "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==" - }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -18138,29 +21539,27 @@ } }, "webpack-subresource-integrity": { - "version": "1.1.0-rc.6", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", - "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "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==", "dev": true, "requires": { - "webpack-core": "^0.6.8" + "webpack-sources": "^1.3.0" } }, "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "when": { @@ -18173,7 +21572,6 @@ "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" } @@ -18185,86 +21583,146 @@ "dev": true }, "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "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": "^2.1.1" + "string-width": "^4.0.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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=", + "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": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "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" + "ansi-regex": "^5.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 + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "worker-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", - "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", + "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", "dev": true, "requires": { "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==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.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" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -18276,14 +21734,15 @@ } }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { @@ -18296,15 +21755,15 @@ } }, "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "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.1.4", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", + "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==" }, "xml2js": { "version": "0.4.23", @@ -18322,11 +21781,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", @@ -18365,9 +21819,9 @@ "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { @@ -18397,6 +21851,18 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", diff --git a/package.json b/package.json index 084278db93..8e5d3381a3 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "test-backend": "./build/bk-build.sh test", "update-webdriver": "webdriver-manager update", "build": "node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng build --prod", - "build-cf": "node --max_old_space_size=1128 --optimize_for_size --gc_interval=100 node_modules/@angular/cli/bin/ng build --prod --aot=false --build-optimizer=false", + "build-cf": "node --max_old_space_size=1500 --gc_interval=100 node_modules/@angular/cli/bin/ng build --prod", "build-dev": "ng build --dev", "prebuild-ui": "npm run customize && npm run build && gulp package-prebuild", "ng": "ng", @@ -28,7 +28,7 @@ "test-frontend:store": "NG_TEST_SUITE=store ng test store --code-coverage --watch=false", "test-frontend:cloud-foundry": "NG_TEST_SUITE=cloud-foundry ng test cloud-foundry --code-coverage --watch=false", "test-frontend:cf-autoscaler": "NG_TEST_SUITE=autoscaler ng test cf-autoscaler --code-coverage --watch=false", - "posttest": "istanbul report json && node build/combine-coverage.js", + "posttest": "nyc report --reporter=html --reporter=lcovonly --reporter=json --tempDir=coverage/nyc", "codecov": "codecov -f coverage/coverage-final.json", "lint": "ng lint --format stylish", "sass-lint": "sass-lint -v", @@ -42,56 +42,53 @@ "customize-default": "gulp customize-default", "customize-reset": "gulp customize-reset", "store-git-metadata": "gulp store-git-metadata", - "postinstall": "npm run customize && gulp dev-setup", - "update": "ng update @nrwl/workspace", - "nx": "nx" + "postinstall": "npm run customize && gulp dev-setup" }, "author": "", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^8.2.9", - "@angular/cdk": "^8.2.2", - "@angular/common": "^8.2.9", - "@angular/compiler": "^8.2.9", - "@angular/core": "^8.2.9", - "@angular/flex-layout": "^8.0.0-beta.27", - "@angular/forms": "^8.2.9", - "@angular/material": "^8.2.2", - "@angular/material-moment-adapter": "^8.2.2", - "@angular/platform-browser": "^8.2.9", - "@angular/platform-browser-dynamic": "^8.2.9", - "@angular/platform-server": "^8.2.9", - "@angular/router": "^8.2.9", - "@ngrx/effects": "^8.3.0", - "@ngrx/router-store": "^8.3.0", - "@ngrx/store": "^8.3.0", - "@ngrx/store-devtools": "^8.3.0", - "@nrwl/angular": "8.5.2", - "@swimlane/ngx-charts": "^12.0.1", - "@swimlane/ngx-graph": "^6.2.0", - "@types/marked": "^0.6.5", - "@types/moment-timezone": "^0.5.12", + "@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", + "@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/moment-timezone": "^0.5.13", + "@types/marked": "^0.7.4", "angular2-virtual-scroll": "^0.4.16", - "core-js": "^3.2.1", - "hammerjs": "^2.0.8", - "immer": "^4.0.0", - "intersect": "^1.0.1", + "core-js": "^3.6.5", + "immer": "^6.0.3", "lodash-es": "^4.17.14", "mappy-breakpoints": "^0.2.3", - "marked": "^0.7.0", + "marked": "^0.8.2", + "intersect": "^1.0.1", "moment": "^2.24.0", - "moment-timezone": "^0.5.12", - "ngrx-store-localstorage": "8.0.0", - "ngx-moment": "^3.3.0", - "normalizr": "^3.2.3", + "moment-timezone": "^0.5.28", + "ngrx-store-localstorage": "9.0.0", + "ngx-moment": "^3.5.0", + "normalizr": "^3.6.0", "reselect": "^4.0.0", - "rxjs": "^6.2.0", + "rxjs": "^6.5.5", "rxjs-spy": "^7.0.2", - "rxjs-websockets": "~8.0.0", - "stratos-angular6-json-schema-form": "^7.0.6", - "ts-md5": "^1.2.4", + "rxjs-websockets": "~8.0.1", + "@cfstratos/ajsf-material": "^0.1.5", + "ts-md5": "^1.2.7", + "tslib": "^1.10.0", "web-animations-js": "^2.3.2", - "xterm": "^4.0.2", + "xterm": "^4.5.0", "xterm-addon-fit": "^0.3.0", "zone.js": "~0.10.2" }, @@ -99,59 +96,58 @@ "node": "12.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.803.7", - "@angular-devkit/build-ng-packagr": "~0.803.7", - "@angular-devkit/schematics": "^8.3.7", - "@angular/cli": "^8.3.7", - "@angular/compiler-cli": "^8.2.9", - "@angular/language-service": "^8.2.9", - "@types/jasmine": "^3.4.2", + "@angular-devkit/build-angular": "~0.901.5", + "@angular-devkit/build-ng-packagr": "~0.901.5", + "@angular-devkit/schematics": "^9.1.5", + "@angular/cli": "^9.1.5", + "@angular/compiler-cli": "^9.1.6", + "@angular/language-service": "^9.1.6", + "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", - "@types/karma": "^3.0.2", - "@types/node": "^12.7.9", - "@types/request": "^2.48.1", + "@types/karma": "^5.0.0", + "@types/node": "^13.11.1", + "@types/request": "^2.48.4", "acorn": "^7.1.1", - "browserstack-local": "^1.4.0", + "browserstack-local": "^1.4.5", "codecov": "^3.6.5", - "codelyzer": "^5.2.0", + "codelyzer": "^5.1.2", "delete": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^10.0.1", + "fs-extra": "^9.0.0", + "globby": "^11.0.0", "gulp": "^4.0.2", - "gulp-zip": "^5.0.0", + "gulp-zip": "^5.0.1", "istanbul": "^0.4.5", - "istanbul-api": "1.2.2", - "istanbul-reports": "1.1.4", + "istanbul-api": "2.1.6", + "istanbul-reports": "3.0.2", "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", + "jasmine-spec-reporter": "~5.0.1", "js-yaml": "~3.13.1", - "karma": "~4.3.0", + "karma": "~5.0.1", "karma-chrome-launcher": "~3.1.0", "karma-cli": "~2.0.0", - "karma-coverage-istanbul-reporter": "^2.0.1", - "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.0", + "karma-coverage-istanbul-reporter": "^2.1.1", + "karma-jasmine": "~3.1.1", + "karma-jasmine-html-reporter": "^1.5.3", "karma-spec-reporter": "0.0.32", "kind-of": "^6.0.3", "lodash": "^4.17.13", - "mem": "5.1.1", + "mem": "6.1.0", "mktemp": "^1.0.0", - "ng-packagr": "^5.4.0", + "ng-packagr": "^9.1.1", "npm-run-all": "^4.1.5", - "protractor": "^5.4.2", + "nyc": "^15.1.0", + "protractor": "^5.4.3", + "protractor-console": "^3.0.0", "ps-node": "^0.1.6", "q": "^1.4.1", - "replace-in-file": "^4.1.3", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "rxjs-tslint": "^0.1.5", + "replace-in-file": "^5.0.2", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "rxjs-tslint": "^0.1.8", "sass-lint": "^1.12.1", "stratos-protractor-reporter": "^1.2.3", - "ts-node": "~8.4.1", - "tsickle": "^0.37.0", - "tslib": "^1.9.0", - "tslint": "~5.20.0", - "typescript": "<3.6.0", - "@nrwl/workspace": "8.5.2" + "ts-node": "^8.8.2", + "tslint": "~6.1.1", + "typescript": "3.8.3" } } diff --git a/protractor.conf.js b/protractor.conf.js index b886d8d400..b41a046f68 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -170,6 +170,10 @@ const config = { print: function () {} }, params: secrets, + plugins: [{ + package: 'protractor-console', + logLevels: ['info', 'warning', 'severe'] + }], onPrepare() { // https://webdriver.io/docs/api/chromium.html#setnetworkconditions // browser.driver.setNetworkConditions({ @@ -199,7 +203,10 @@ const config = { }).getJasmine2Reporter()); jasmine.getEnv().addReporter(new SpecReporter({ spec: { - displayStacktrace: true, + displayStacktrace: 'raw', + }, + summary: { + displayStacktrace: 'raw', }, customProcessors: specReporterCustomProcessors })); @@ -240,7 +247,7 @@ const config = { if (resp.statusCode >= 400) { defer.reject('Failed to validate Github API Url. Status Code: ' + resp.statusCode); } else { - defer.fulfill('Github API Url responding'); + defer.fulfill('Validated Github API Url successfully'); } }) .on("error", (err) => { @@ -254,6 +261,7 @@ const config = { if (process.env['STRATOS_E2E_BASE_URL']) { config.baseUrl = process.env['STRATOS_E2E_BASE_URL']; } + exports.config = config // Should we run e2e tests in headless Chrome? const headless = secrets.headless || process.env['STRATOS_E2E_HEADLESS']; diff --git a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts index 96f92c9ba3..594a5608aa 100644 --- a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts +++ b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { generateCFEntities } from '../../cloud-foundry/src/cf-entity-generator'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { generateASEntities } from './store/autoscaler-entity-generator'; @NgModule({ diff --git a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler.module.ts b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler.module.ts index bba86237ea..e7463eee23 100644 --- a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler.module.ts +++ b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler.module.ts @@ -5,15 +5,16 @@ import { EffectsModule } from '@ngrx/effects'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import { of } from 'rxjs'; -import { CloudFoundryComponentsModule } from '../../cloud-foundry/src/shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../cloud-foundry/src/shared/cf-shared.module'; import { CoreModule } from '../../core/src/core/core.module'; -import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; import { MDAppModule } from '../../core/src/core/md.module'; import { SharedModule } from '../../core/src/shared/shared.module'; +import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; import { AutoscalerModule } from './core/autoscaler.module'; import { AutoscalerTabExtensionComponent } from './features/autoscaler-tab-extension/autoscaler-tab-extension.component'; import { generateASEntities } from './store/autoscaler-entity-generator'; import { AutoscalerEffects } from './store/autoscaler.effects'; +import { ExtensionService } from 'frontend/packages/core/src/core/extension/extension-service'; // FIXME Work out why we need this and remove it. const customRoutes: Routes = [ @@ -38,12 +39,15 @@ const customRoutes: Routes = [ SharedModule, MDAppModule, NgxChartsModule, - CloudFoundryComponentsModule, + CloudFoundrySharedModule, AutoscalerModule, RouterModule.forRoot(customRoutes), EntityCatalogModule.forFeature(generateASEntities), EffectsModule.forFeature([ AutoscalerEffects + ]), + ExtensionService.declare([ + AutoscalerTabExtensionComponent, ]) ], declarations: [ diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-metric.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-metric.ts index 90660b13f3..899e687833 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-metric.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-metric.ts @@ -31,7 +31,7 @@ function initMetricData(metricName: string): AppAutoscalerMetricDataLocal { colorTarget: [] }, markline: [], - unit: AutoscalerConstants.metricMap[metricName].unit_internal, + unit: AutoscalerConstants.getMetricUnit(metricName), chartMaxValue: 0, }; } @@ -228,8 +228,8 @@ function getMetricBasicInfo( let maxCount = 1; let preTimestamp = 0; let maxValue = -1; - const unit = AutoscalerConstants.metricMap[metricName].unit_internal; - intervalMap[AutoscalerConstants.metricMap[metricName].interval] = 1; + let unit = AutoscalerConstants.getMetricUnit(metricName); + intervalMap[AutoscalerConstants.getMetricInterval(metricName)] = 1; const resultInterval = source.reduce((interval, item) => { maxValue = Math.max(Number(item.value), maxValue); const thisTimestamp = Math.round(item.timestamp / AutoscalerConstants.S2NS); @@ -240,9 +240,9 @@ function getMetricBasicInfo( maxCount = intervalMap[currentInterval]; } preTimestamp = thisTimestamp; - // unit = item.unit === '' ? unit : item.unit; + unit = item.unit || unit; return interval; - }, AutoscalerConstants.metricMap[metricName].interval); + }, AutoscalerConstants.getMetricInterval(metricName)); return { interval: resultInterval, unit, diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-policy.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-policy.ts index ef37ce3d6d..5e11d7642b 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-policy.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-transform-policy.ts @@ -83,7 +83,7 @@ export function autoscalerTransformMapToArray(oldPolicy: AppAutoscalerPolicyLoca instance_max_count: oldPolicy.instance_max_count }; const scalingRules: AppScalingRule[] = oldPolicy.scaling_rules_form.map((trigger) => { - return { + const newTrigger: AppScalingRule = { adjustment: trigger.adjustment, breach_duration_secs: trigger.breach_duration_secs, cool_down_secs: trigger.breach_duration_secs, @@ -91,6 +91,10 @@ export function autoscalerTransformMapToArray(oldPolicy: AppAutoscalerPolicyLoca operator: trigger.operator, threshold: trigger.threshold }; + if (AutoscalerConstants.getMetricUnit(trigger.metric_type) === '' && trigger.unit && trigger.unit !== '') { + newTrigger.unit = trigger.unit; + } + return newTrigger; }); if (scalingRules.length > 0) { newPolicy.scaling_rules = scalingRules; diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-util.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-util.ts index a1b84d299c..9e73dfed78 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-util.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-util.ts @@ -88,11 +88,19 @@ export class AutoscalerConstants { } }; - public static getMetricUnit(metricType: string) { + public static getMetricUnit(metricType: string, unit?: string) { if (AutoscalerConstants.metricMap[metricType]) { return AutoscalerConstants.metricMap[metricType].unit_internal; } else { - return ''; + return unit || ''; + } + } + + public static getMetricInterval(metricType: string) { + if (AutoscalerConstants.metricMap[metricType]) { + return AutoscalerConstants.metricMap[metricType].interval; + } else { + return 40; } } @@ -110,6 +118,7 @@ export const PolicyAlert = { alertInvalidPolicyMaximumRange: 'The Maximum Instance Count must be an integer greater than the Minimum Instance Count.', alertInvalidPolicyInitialMaximumRange: 'The Initial Minimum Instance Count must be an integer between Minimum Instance Count and Maximum Instance Count.', + alertInvalidPolicyTriggerMetricName: 'Invalid metric type name, only combination of letters, numbers and underlines "_" are allowed.', alertInvalidPolicyTriggerUpperThresholdRange: 'The Upper Threshold value must be an integer greater than the Lower Threshold value.', alertInvalidPolicyTriggerLowerThresholdRange: 'The Lower Threshold value must be an integer between 1 and (Upper Threshold-1).', alertInvalidPolicyTriggerThreshold100: 'The Lower/Upper Threshold value of memoryutil must be an integer below or equal to 100.', diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-validation.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-validation.ts index 2f9f60de3f..22410741c5 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-validation.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler-helpers/autoscaler-validation.ts @@ -133,3 +133,8 @@ export function getThresholdMax(policyTriggers: AppScalingRule[], metricType: st return Number.MAX_VALUE; } } + +export function inValidMetricType(metricType: string) { + const metricTypePattern = new RegExp('^[a-zA-Z0-9_]+$'); + return !metricTypePattern.test(metricType); +} diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts index 05795f3f22..2faabe86af 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import { ApplicationService } from '../../../cloud-foundry/src/features/applications/application.service'; -import { CloudFoundryComponentsModule } from '../../../cloud-foundry/src/shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../cloud-foundry/src/shared/cf-shared.module'; import { CoreModule } from '../../../core/src/core/core.module'; import { SharedModule } from '../../../core/src/shared/shared.module'; import { AutoscalerBaseComponent } from '../features/autoscaler-base.component'; @@ -10,6 +10,9 @@ import { AutoscalerMetricPageComponent } from '../features/autoscaler-metric-pag import { AutoscalerScaleHistoryPageComponent, } from '../features/autoscaler-scale-history-page/autoscaler-scale-history-page.component'; +import { + EditAutoscalerCredentialComponent, +} from '../features/edit-autoscaler-credential/edit-autoscaler-credential.component'; import { EditAutoscalerPolicyStep1Component, } from '../features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component'; @@ -54,7 +57,7 @@ import { AutoscalerRoutingModule } from './autoscaler.routing'; SharedModule, AutoscalerRoutingModule, NgxChartsModule, - CloudFoundryComponentsModule, + CloudFoundrySharedModule, ], declarations: [ AutoscalerBaseComponent, @@ -65,6 +68,7 @@ import { AutoscalerRoutingModule } from './autoscaler.routing'; EditAutoscalerPolicyStep2Component, EditAutoscalerPolicyStep3Component, EditAutoscalerPolicyStep4Component, + EditAutoscalerCredentialComponent, CardAutoscalerDefaultComponent, AppAutoscalerMetricChartCardComponent, AppAutoscalerComboChartComponent, diff --git a/src/frontend/packages/cf-autoscaler/src/core/autoscaler.routing.ts b/src/frontend/packages/cf-autoscaler/src/core/autoscaler.routing.ts index f4a0685688..c19d672dc3 100644 --- a/src/frontend/packages/cf-autoscaler/src/core/autoscaler.routing.ts +++ b/src/frontend/packages/cf-autoscaler/src/core/autoscaler.routing.ts @@ -12,6 +12,7 @@ import { AutoscalerScaleHistoryPageComponent, } from '../features/autoscaler-scale-history-page/autoscaler-scale-history-page.component'; import { EditAutoscalerPolicyComponent } from '../features/edit-autoscaler-policy/edit-autoscaler-policy.component'; +import { EditAutoscalerCredentialComponent } from '../features/edit-autoscaler-credential/edit-autoscaler-credential.component'; const autoscalerRoutes: Routes = [ { @@ -25,6 +26,10 @@ const autoscalerRoutes: Routes = [ path: 'edit-autoscaler-policy', component: EditAutoscalerPolicyComponent, }, + { + path: 'edit-autoscaler-credential', + component: EditAutoscalerCredentialComponent, + }, { path: 'app-autoscaler-metric-page', component: AutoscalerMetricPageComponent, diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-base.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-base.component.spec.ts index 83cb58eb35..fb7e09d975 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-base.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-base.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../core/src/core/core.module'; import { SharedModule } from '../../../core/src/shared/shared.module'; import { TabNavService } from '../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../cf-autoscaler-testing.module'; import { AutoscalerBaseComponent } from './autoscaler-base.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-metric-page/autoscaler-metric-page.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-metric-page/autoscaler-metric-page.component.spec.ts index e59ab50816..e387014816 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-metric-page/autoscaler-metric-page.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-metric-page/autoscaler-metric-page.component.spec.ts @@ -5,10 +5,10 @@ import { RouterTestingModule } from '@angular/router/testing'; import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../core/test-framework/application-service-helper'; import { CfAutoscalerTestingModule } from '../../cf-autoscaler-testing.module'; import { AutoscalerMetricPageComponent } from './autoscaler-metric-page.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-scale-history-page/autoscaler-scale-history-page.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-scale-history-page/autoscaler-scale-history-page.component.spec.ts index 043a399200..ccb88d5a1b 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-scale-history-page/autoscaler-scale-history-page.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-scale-history-page/autoscaler-scale-history-page.component.spec.ts @@ -5,10 +5,10 @@ import { RouterTestingModule } from '@angular/router/testing'; import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../core/test-framework/application-service-helper'; import { CfAutoscalerTestingModule } from '../../cf-autoscaler-testing.module'; import { AutoscalerScaleHistoryPageComponent } from './autoscaler-scale-history-page.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html index 8338842097..2a20fe1798 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.html @@ -10,6 +10,12 @@ delete Delete Policy + + + +
+ + + add_boxCreate + + +
+

Credentials are required when submitting custom metrics to the autoscaler. They can either be randomly + generated or supplied.

+

Please note, only the latest set of credentials are valid. Creating a new set will invalidate any + previously created.

+
+
+
+ Type + + Random + Custom + +
+ + + + Username is required + + + + + + Password is required + + +
+
+ +
+
+

Credentials have been generated. Use the following details to PUT custom metric data

+

They will only be available to view here once. Please ensure they are + recorded correctly

+
    +
  • Username: {{credential.username}}
  • +
  • Password: {{credential.password}}
  • +
  • Authorization Header: {{credential.authHeader}}
  • +
  • URL: {{credential.fullUrl}}
  • +
+
+
+
+ + + deleteDelete + + +
+

+ Delete the last credentials that were created. +

+
+
+ +
+
+
+ + +
\ No newline at end of file diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.scss b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.scss new file mode 100644 index 0000000000..10f365b810 --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.scss @@ -0,0 +1,56 @@ +.autoscaler-credential { + + &__card { + + &:first-of-type { + margin-bottom: 24px; + } + + mat-card-header { + align-items: center; + display: flex; + mat-icon { + margin-right: 5px; + } + } + } + + &__form { + display: flex; + flex-direction: column; + margin-top: 15px; + mat-form-field { + max-width: 350px; + } + } + + &__toggle { + display: flex; + flex-direction: column; + padding-bottom: 7px; + + mat-radio-group { + padding-top: 10px; + mat-radio-button { + padding-right: 12px; + + } + } + } + + &__buttons { + display: flex; + button { + display: flex; + justify-content: center; + margin-right: 8px; + width: 100px; + } + &--spinner { + align-items: center; + display: flex; + flex-direction: row; + justify-content: center; + } + } +} diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.spec.ts new file mode 100644 index 0000000000..131139620e --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.spec.ts @@ -0,0 +1,50 @@ +import { DatePipe } from '@angular/common'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; +import { CoreModule } from '../../../../core/src/core/core.module'; +import { SharedModule } from '../../../../core/src/shared/shared.module'; +import { TabNavService } from '../../../../core/tab-nav.service'; +import { createBasicStoreModule } from '../../../../store/testing/public-api'; +import { CfAutoscalerTestingModule } from '../../cf-autoscaler-testing.module'; +import { EditAutoscalerCredentialComponent } from './edit-autoscaler-credential.component'; + +describe('EditAutoscalerCredentialComponent', () => { + let component: EditAutoscalerCredentialComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + EditAutoscalerCredentialComponent, + ], + imports: [ + BrowserAnimationsModule, + createBasicStoreModule(), + CoreModule, + SharedModule, + RouterTestingModule, + CfAutoscalerTestingModule + ], + providers: [ + DatePipe, + { provide: ApplicationService, useClass: ApplicationServiceMock }, + TabNavService, + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditAutoscalerCredentialComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); 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 new file mode 100644 index 0000000000..e2f4f14a6d --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-credential/edit-autoscaler-credential.component.ts @@ -0,0 +1,186 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; +import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar'; +import { Store } from '@ngrx/store'; +import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { delay, filter, first, map, pairwise, publishReplay, refCount, tap } from 'rxjs/operators'; + +import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { safeUnsubscribe } from '../../../../core/src/core/utils.service'; +import { ConfirmationDialogConfig } from '../../../../core/src/shared/components/confirmation-dialog.config'; +import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; +import { AppState } from '../../../../store/src/app-state'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; +import { EntityService } from '../../../../store/src/entity-service'; +import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; +import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; +import { selectDeletionInfo } from '../../../../store/src/selectors/api.selectors'; +import { + DeleteAppAutoscalerCredentialAction, + UpdateAppAutoscalerCredentialAction, +} from '../../store/app-autoscaler.actions'; +import { AppAutoscalerCredential } from '../../store/app-autoscaler.types'; + +@Component({ + selector: 'app-edit-autoscaler-credential', + templateUrl: './edit-autoscaler-credential.component.html', + styleUrls: ['./edit-autoscaler-credential.component.scss'], + providers: [ + { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher }, + ] +}) +export class EditAutoscalerCredentialComponent implements OnInit, OnDestroy { + + parentUrl = `/applications/${this.applicationService.cfGuid}/${this.applicationService.appGuid}/autoscale`; + applicationName$: Observable; + + public editCredentialForm: FormGroup; + public appAutoscalerCredential$: Observable; + + private appAutoscalerCredentialErrorSub: Subscription; + private appAutoscalerCredentialSnackBarRef: MatSnackBarRef; + + + private creating = new BehaviorSubject(false); + public creating$ = this.creating.asObservable(); + private deleting = new BehaviorSubject(false); + public deleting$ = this.deleting.asObservable(); + + constructor( + public applicationService: ApplicationService, + private fb: FormBuilder, + private store: Store, + private entityServiceFactory: EntityServiceFactory, + private appAutoscalerCredentialSnackBar: MatSnackBar, + private confirmDialog: ConfirmationDialogService, + ) { + this.editCredentialForm = this.fb.group({ + actype: new FormControl({ value: true }), + acusername: new FormControl({ value: '', disabled: true }, Validators.required), + acpassword: new FormControl({ value: '', disabled: true }, Validators.required), + }); + } + + ngOnInit() { + this.applicationName$ = this.applicationService.app$.pipe( + map(({ entity }) => entity ? entity.entity.name : null), + publishReplay(1), + refCount() + ); + } + + ngOnDestroy(): void { + if (this.appAutoscalerCredentialSnackBarRef) { + this.appAutoscalerCredentialSnackBarRef.dismiss(); + } + safeUnsubscribe(this.appAutoscalerCredentialErrorSub); + } + + toggleChange() { + if (this.editCredentialForm.controls.actype.value) { + this.editCredentialForm.controls.acusername.setValue(''); + this.editCredentialForm.controls.acpassword.setValue(''); + this.editCredentialForm.controls.acusername.disable(); + this.editCredentialForm.controls.acpassword.disable(); + } else { + this.editCredentialForm.controls.acusername.setValue(''); + this.editCredentialForm.controls.acpassword.setValue(''); + this.editCredentialForm.controls.acusername.enable(); + this.editCredentialForm.controls.acpassword.enable(); + } + } + + createCredential() { + this.creating.next(true); + let action: UpdateAppAutoscalerCredentialAction; + if (this.editCredentialForm.controls.actype.value) { + action = new UpdateAppAutoscalerCredentialAction(this.applicationService.appGuid, this.applicationService.cfGuid); + } else { + const credential: AppAutoscalerCredential = { + username: this.editCredentialForm.controls.acusername.value, + password: this.editCredentialForm.controls.acpassword.value, + }; + action = new UpdateAppAutoscalerCredentialAction(this.applicationService.appGuid, this.applicationService.cfGuid, credential); + } + const updateAppAutoscalerCredentialService: EntityService = this.entityServiceFactory.create( + this.applicationService.appGuid, + action, + ); + this.appAutoscalerCredential$ = updateAppAutoscalerCredentialService.entityObs$.pipe( + filter(({ entity, entityRequestInfo }) => { + console.log(entity, entityRequestInfo) + return entityRequestInfo && !entityRequestInfo.creating && !entityRequestInfo.deleting.busy; + }), + map(({ entity }) => entity ? entity.entity : null), + map(creds => { + if (!creds) { + return; + } + return { + ...creds, + authHeader: 'basic ' + btoa(`${creds.username}:${creds.password}`), + fullUrl: `${creds.url}/v1/apps/${creds.app_id}/metrics` + } + }), + publishReplay(1), + refCount() + ); + updateAppAutoscalerCredentialService.entityMonitor.getUpdatingSection(action.updatingKey).pipe( + delay(150), + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + first(), + ).subscribe(actionState => { + this.creating.next(false); + if (actionState.error) { + if (this.appAutoscalerCredentialSnackBarRef) { + this.appAutoscalerCredentialSnackBarRef.dismiss(); + } + this.appAutoscalerCredentialSnackBarRef = + this.appAutoscalerCredentialSnackBar.open(`Failed to create credentials: ${actionState.message}`, 'Dismiss'); + } + + }); + this.store.dispatch(action); + } + + deleteCredentialConfirm() { + const confirmation = new ConfirmationDialogConfig( + 'Delete Credentials', + 'Are you sure you want to delete the credentials?', + 'Delete', + true + ); + this.confirmDialog.open(confirmation, () => { + this.deleteCredential().pipe( + first(), + ).subscribe(actionState => { + if (actionState.error) { + if (this.appAutoscalerCredentialSnackBarRef) { + this.appAutoscalerCredentialSnackBarRef.dismiss(); + } + this.appAutoscalerCredentialSnackBarRef = + this.appAutoscalerCredentialSnackBar.open(`Failed to delete credential: ${actionState.message}`, 'Dismiss'); + } + }); + }); + } + + deleteCredential(): Observable { + this.deleting.next(true); + const action = new DeleteAppAutoscalerCredentialAction(this.applicationService.appGuid, this.applicationService.cfGuid); + this.store.dispatch(action); + const entityKey = entityCatalog.getEntityKey(action); + + return this.store.select(selectDeletionInfo(entityKey, this.applicationService.appGuid)).pipe( + delay(250), + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + tap(() => this.deleting.next(false)) + ); + } + +} diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-service.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-service.spec.ts index e927ff0fc9..09d208f0a0 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-service.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-service.spec.ts @@ -1,8 +1,9 @@ import { inject, TestBed } from '@angular/core/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationsModule } from '../../../../cloud-foundry/src/features/applications/applications.module'; import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { createEmptyStoreModule } from '@stratos/store/testing'; +import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; import { EditAutoscalerPolicyService } from './edit-autoscaler-policy-service'; describe('EditAutoscalerPolicyService', () => { @@ -11,6 +12,7 @@ describe('EditAutoscalerPolicyService', () => { providers: [ EditAutoscalerPolicyService, EntityServiceFactory, + EntityMonitorFactory ], imports: [ ApplicationsModule, diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.spec.ts index 978d5b751a..ac3ca5bcab 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../../cf-autoscaler-testing.module'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; import { EditAutoscalerPolicyStep1Component } from './edit-autoscaler-policy-step1.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.html b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.html index fbdd6401b7..086ffacca1 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.html +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.html @@ -12,7 +12,8 @@
- If average {{rule.metric_type}} {{rule.operator}} {{rule.threshold}} {{getMetricUnit(rule.metric_type)}} + If average {{rule.metric_type}} {{rule.operator}} {{rule.threshold}} + {{getMetricUnit(rule.metric_type, rule.unit)}} for {{rule.breach_duration_secs}} seconds, then {{rule.adjustment}} instances. Cooldown: {{rule.cool_down_secs}} seconds.
@@ -20,12 +21,12 @@
If average - - - {{ metricType }} - - + + + + {{metricType}} + - - {{metricUnit$ | async}} - - for + + + + {{getMetricUnit(editMetricType)}} for @@ -66,6 +67,12 @@ seconds.
+ + Metric type is required + + + {{policyAlert.alertInvalidPolicyTriggerMetricName}} + Threshold is required diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.scss b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.scss index 3ed560932a..817d71e32d 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.scss +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.scss @@ -27,3 +27,13 @@ font-size: 85%; } } + +.autoscaler-edit-select { + input { + left: 0; + position: absolute; + top: .5em; + width: 90%; + z-index: 200; + } +} diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.spec.ts index 039bf8b918..f6dc925fa8 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step2/edit-autoscaler-policy-step2.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; import { EditAutoscalerPolicyStep2Component } from './edit-autoscaler-policy-step2.component'; 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 d35e6de1a9..3c4df6dc89 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 @@ -3,7 +3,7 @@ import { AbstractControl, FormBuilder, FormGroup, ValidatorFn, Validators } from import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; import { ActivatedRoute } from '@angular/router'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { map, startWith } from 'rxjs/operators'; import { ApplicationService } from '../../../../../cloud-foundry/src/features/applications/application.service'; import { safeUnsubscribe } from '../../../../../core/src/core/utils.service'; @@ -16,6 +16,7 @@ import { import { getThresholdMax, getThresholdMin, + inValidMetricType, numberWithFractionOrExceedRange, } from '../../../core/autoscaler-helpers/autoscaler-validation'; import { AppAutoscalerInvalidPolicyError, AppAutoscalerPolicyLocal } from '../../../store/app-autoscaler.types'; @@ -34,6 +35,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp policyAlert = PolicyAlert; metricTypes = AutoscalerConstants.MetricTypes; + filteredMetricTypes$: Observable; private metricUnitSubject = new BehaviorSubject(this.metricTypes[0]); metricUnit$: Observable; operatorTypes = AutoscalerConstants.UpperOperators.concat(AutoscalerConstants.LowerOperators); @@ -56,9 +58,10 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp ) { super(service, route); this.editTriggerForm = this.fb.group({ - metric_type: [0, this.validateTriggerMetricType()], + metric_type: [0, [Validators.required, this.validateTriggerMetricType()]], operator: [0, this.validateTriggerOperator()], threshold: [0, [Validators.required, Validators.min(1), this.validateTriggerThreshold()]], + unit: [0], adjustment: [0, [Validators.required, Validators.min(1), this.validateTriggerAdjustment()]], breach_duration_secs: [0, [ Validators.min(AutoscalerConstants.PolicyDefaultSetting.breach_duration_secs_min), @@ -76,6 +79,11 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp this.subs.push(this.editTriggerForm.get('metric_type').valueChanges.pipe( map(value => this.getMetricUnit(value)), ).subscribe(unit => this.metricUnitSubject.next(unit))); + + this.filteredMetricTypes$ = this.editTriggerForm.controls.metric_type.valueChanges.pipe( + startWith(''), + map(value => this.metricTypes.filter(type => type.toLocaleLowerCase().includes(value))) + ) } addTrigger = () => { @@ -100,6 +108,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp metric_type: this.editMetricType, operator: this.currentPolicy.scaling_rules_form[index].operator, threshold: this.currentPolicy.scaling_rules_form[index].threshold, + unit: this.currentPolicy.scaling_rules_form[index].unit || '', adjustment: Math.abs(Number(this.currentPolicy.scaling_rules_form[index].adjustment)), breach_duration_secs: this.currentPolicy.scaling_rules_form[index].breach_duration_secs, cool_down_secs: this.currentPolicy.scaling_rules_form[index].cool_down_secs, @@ -115,6 +124,7 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp this.currentPolicy.scaling_rules_form[this.editIndex].metric_type = this.editTriggerForm.get('metric_type').value; this.currentPolicy.scaling_rules_form[this.editIndex].operator = this.editTriggerForm.get('operator').value; this.currentPolicy.scaling_rules_form[this.editIndex].threshold = this.editTriggerForm.get('threshold').value; + this.currentPolicy.scaling_rules_form[this.editIndex].unit = this.editTriggerForm.get('unit').value; this.currentPolicy.scaling_rules_form[this.editIndex].adjustment = adjustmentM; if (this.editTriggerForm.get('breach_duration_secs').value) { this.currentPolicy.scaling_rules_form[this.editIndex].breach_duration_secs = @@ -134,11 +144,16 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp validateTriggerMetricType(): ValidatorFn { return (control: AbstractControl): { [key: string]: any } => { - if (this.editTriggerForm) { - this.editMetricType = control.value; - this.editTriggerForm.controls.threshold.updateValueAndValidity(); + if (!this.editTriggerForm) { + return null; } - return null; + this.editMetricType = control.value; + const errors: AppAutoscalerInvalidPolicyError = {}; + if (inValidMetricType(control.value)) { + errors.alertInvalidPolicyTriggerMetricName = { value: control.value }; + } + this.editTriggerForm.controls.threshold.updateValueAndValidity(); + return Object.keys(errors).length === 0 ? null : errors; }; } @@ -196,8 +211,8 @@ export class EditAutoscalerPolicyStep2Component extends EditAutoscalerPolicy imp }; } - getMetricUnit(metricType: string) { - return AutoscalerConstants.getMetricUnit(metricType); + getMetricUnit(metricType: string, unit?: string) { + return AutoscalerConstants.getMetricUnit(metricType, unit); } ngOnDestroy() { diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.spec.ts index 5a8379443c..52b26205f7 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step3/edit-autoscaler-policy-step3.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; import { EditAutoscalerPolicyStep3Component } from './edit-autoscaler-policy-step3.component'; 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 90db0a0f92..542688df0a 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 @@ -242,11 +242,6 @@ export class EditAutoscalerPolicyStep3Component extends EditAutoscalerPolicy imp this.setRecurringScheduleValidator(); } - resetRepeatType(key: string) { - this.editRepeatType = key; - this.setRecurringScheduleValidator(); - } - mutualValidate(inputName: string, lastValid: boolean, currentValid: boolean) { if (this.editRecurringScheduleForm && lastValid !== currentValid) { this.editRecurringScheduleForm.controls[inputName].updateValueAndValidity(); diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.spec.ts index 20d3a17bfe..8bf205e4f0 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-step4/edit-autoscaler-policy-step4.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../../cf-autoscaler-testing.module'; import { EditAutoscalerPolicyService } from '../edit-autoscaler-policy-service'; import { EditAutoscalerPolicyStep4Component } from './edit-autoscaler-policy-step4.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy.component.spec.ts index b10ff34509..b9e5aac8c8 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy.component.spec.ts @@ -2,13 +2,13 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../cf-autoscaler-testing.module'; import { EditAutoscalerPolicyService } from './edit-autoscaler-policy-service'; import { EditAutoscalerPolicyStep1Component } from './edit-autoscaler-policy-step1/edit-autoscaler-policy-step1.component'; diff --git a/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.spec.ts index bd5c68c372..e0b1c180b2 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.spec.ts @@ -1,21 +1,25 @@ import { CommonModule } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationService } from '../../../../cloud-foundry/src/features/applications/application.service'; import { RunningInstancesComponent, } from '../../../../cloud-foundry/src/shared/components/running-instances/running-instances.component'; +import { ApplicationStateService } from '../../../../cloud-foundry/src/shared/services/application-state.service'; +import { ApplicationServiceMock } from '../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../core/src/core/core.module'; -import { ApplicationStateService } from '../../../../core/src/shared/components/application-state/application-state.service'; +import { + CopyToClipboardComponent, +} from '../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; import { MetadataItemComponent } from '../../../../core/src/shared/components/metadata-item/metadata-item.component'; +import { AppTestModule } from '../../../../core/test-framework/core-test.helper'; +import { EntityCatalogHelper } from '../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { ApplicationServiceMock } from '../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../cf-autoscaler-testing.module'; import { CardAutoscalerDefaultComponent } from './card-autoscaler-default.component'; -import { CopyToClipboardComponent } from '../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; describe('CardAutoscalerDefaultComponent', () => { let component: CardAutoscalerDefaultComponent; @@ -35,12 +39,14 @@ describe('CardAutoscalerDefaultComponent', () => { CommonModule, NoopAnimationsModule, createEmptyStoreModule(), + AppTestModule ], providers: [ { provide: ApplicationService, useClass: ApplicationServiceMock }, ApplicationStateService, EntityMonitorFactory, PaginationMonitorFactory, + EntityCatalogHelper ] }) .compileComponents(); diff --git a/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.ts b/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.ts index 24fa63f843..2dc9dc7c7b 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/card-autoscaler-default/card-autoscaler-default.component.ts @@ -17,7 +17,7 @@ import { AppAutoscalerPolicyLocal } from '../../store/app-autoscaler.types'; }) export class CardAutoscalerDefaultComponent implements OnInit { - @ViewChild('instanceField', { static: false }) instanceField: ElementRef; + @ViewChild('instanceField') instanceField: ElementRef; constructor( public appService: ApplicationService, diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-config.service.spec.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-config.service.spec.ts index 9865e668e1..a30d9ddc7e 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-config.service.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-config.service.spec.ts @@ -3,17 +3,22 @@ import { HttpBackend, HttpClient, HttpClientModule } from '@angular/common/http' import { HttpTestingController } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { GetApplication } from '../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; import { applicationEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { ApplicationsModule } from '../../../../../cloud-foundry/src/features/applications/applications.module'; +import { + generateTestApplicationServiceProvider, +} from '../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/src/core/core.module'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; -import { generateTestApplicationServiceProvider } from '../../../../../core/test-framework/application-service-helper'; +import { AppTestModule } from '../../../../../core/test-framework/core-test.helper'; import { generateTestEntityServiceProvider } from '../../../../../core/test-framework/entity-service.helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; +import { EntityCatalogHelper } from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; +import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { CfAutoscalerTestingModule } from '../../../cf-autoscaler-testing.module'; import { CfAppAutoscalerEventsConfigService } from './cf-app-autoscaler-events-config.service'; @@ -28,6 +33,8 @@ describe('CfAppAutoscalerEventsConfigService', () => { { provide: HttpBackend, useClass: HttpTestingController }, CfAppAutoscalerEventsConfigService, EntityServiceFactory, + EntityMonitorFactory, + EntityCatalogHelper, generateTestEntityServiceProvider( appGuid, cfEntityFactory(applicationEntityType), @@ -45,6 +52,7 @@ describe('CfAppAutoscalerEventsConfigService', () => { ApplicationsModule, createEmptyStoreModule(), RouterTestingModule, + AppTestModule ] }); }); diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-data-source.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-data-source.ts index 3305480068..22d2449f95 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-data-source.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-event/cf-app-autoscaler-events-data-source.ts @@ -1,7 +1,7 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { getRowMetadata } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; 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 { MetricsRangeSelectorService } from '../../../../../core/src/shared/services/metrics-range-selector.service'; 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.spec.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.spec.ts index 1e1f333790..1061670864 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.spec.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.spec.ts @@ -1,6 +1,6 @@ -/* tslint:disable:max-line-length */ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import { @@ -9,20 +9,24 @@ import { import { ServiceActionHelperService, } from '../../../../../../cloud-foundry/src/shared/data-services/service-action-helper.service'; -import { CoreModule } from '../../../../../../core/src/core/core.module'; +import { ApplicationStateService } from '../../../../../../cloud-foundry/src/shared/services/application-state.service'; import { - ApplicationStateService, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; + generateTestApplicationServiceProvider, +} from '../../../../../../cloud-foundry/test-framework/application-service-helper'; +import { CoreModule } from '../../../../../../core/src/core/core.module'; import { ConfirmationDialogService } from '../../../../../../core/src/shared/components/confirmation-dialog.service'; +import { AppTestModule } from '../../../../../../core/test-framework/core-test.helper'; +import { + EntityCatalogHelper, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { generateTestApplicationServiceProvider } from '../../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../../../cf-autoscaler-testing.module'; import { AppAutoscalerMetricChartCardComponent } from './app-autoscaler-metric-chart-card.component'; import { AppAutoscalerComboChartComponent } from './combo-chart/combo-chart.component'; import { AppAutoscalerComboSeriesVerticalComponent } from './combo-chart/combo-series-vertical.component'; +/* tslint:disable:max-line-length */ /* tslint:enable:max-line-length */ describe('AppAutoscalerMetricChartCardComponent', () => { @@ -40,9 +44,11 @@ describe('AppAutoscalerMetricChartCardComponent', () => { createEmptyStoreModule(), CoreModule, NgxChartsModule, + AppTestModule ], providers: [ EntityMonitorFactory, + EntityCatalogHelper, generateTestApplicationServiceProvider('1', '1'), ApplicationEnvVarsHelper, ApplicationStateService, diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-chart.component.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-chart.component.ts index 776886571c..f7e5a8b01f 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-chart.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-chart.component.ts @@ -27,7 +27,7 @@ import { curveLinear } from 'd3-shape'; }) export class AppAutoscalerComboChartComponent extends BaseChartComponent { - @ViewChild(LineSeriesComponent, { static: false }) lineSeriesComponent: LineSeriesComponent; + @ViewChild(LineSeriesComponent) lineSeriesComponent: LineSeriesComponent; @Input() curve: any = curveLinear; @Input() legend = false; diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-series-vertical.component.spec.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-series-vertical.component.spec.ts index 31df0d2711..d8ec4e79aa 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-series-vertical.component.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-card/combo-chart/combo-series-vertical.component.spec.ts @@ -2,14 +2,14 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; +import { ApplicationServiceMock } from '../../../../../../../cloud-foundry/test-framework/application-service-helper'; import { CoreModule } from '../../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { AppAutoscalerComboSeriesVerticalComponent } from './combo-series-vertical.component'; describe('AppAutoscalerComboSeriesVerticalComponent', () => { diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-data-source.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-data-source.ts index e33e839e12..bbff81af73 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-data-source.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-data-source.ts @@ -1,7 +1,7 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { getRowMetadata } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; 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 { MetricsRangeSelectorService } from '../../../../../core/src/shared/services/metrics-range-selector.service'; diff --git a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-list-config.service.spec.ts b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-list-config.service.spec.ts index b105b4b8a9..383469b8a8 100644 --- a/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-list-config.service.spec.ts +++ b/src/frontend/packages/cf-autoscaler/src/shared/list-types/app-autoscaler-metric-chart/app-autoscaler-metric-chart-list-config.service.spec.ts @@ -1,22 +1,24 @@ -/* tslint:disable:max-line-length */ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; +import { createEmptyStoreModule } from '@stratos/store/testing'; import { ApplicationEnvVarsHelper, } from '../../../../../cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; +import { ApplicationStateService } from '../../../../../cloud-foundry/src/shared/services/application-state.service'; import { - ApplicationStateService, -} from '../../../../../core/src/shared/components/application-state/application-state.service'; + generateTestApplicationServiceProvider, +} from '../../../../../cloud-foundry/test-framework/application-service-helper'; +import { MetricsRangeSelectorService } from '../../../../../core/src/shared/services/metrics-range-selector.service'; +import { AppTestModule } from '../../../../../core/test-framework/core-test.helper'; +import { EntityCatalogHelper } from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; +import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { MetricsRangeSelectorService } from '../../../../../core/src/shared/services/metrics-range-selector.service'; -import { generateTestApplicationServiceProvider } from '../../../../../core/test-framework/application-service-helper'; -import { createEmptyStoreModule } from '@stratos/store/testing'; import { CfAutoscalerTestingModule } from '../../../cf-autoscaler-testing.module'; import { AppAutoscalerMetricChartListConfigService } from './app-autoscaler-metric-chart-list-config.service'; +/* tslint:disable:max-line-length */ /* tslint:enable:max-line-length */ @@ -30,6 +32,7 @@ describe('AppAutoscalerMetricChartListConfigService', () => { DatePipe, EntityServiceFactory, EntityMonitorFactory, + EntityCatalogHelper, ApplicationStateService, PaginationMonitorFactory, MetricsRangeSelectorService @@ -37,6 +40,7 @@ describe('AppAutoscalerMetricChartListConfigService', () => { imports: [ CfAutoscalerTestingModule, createEmptyStoreModule(), + AppTestModule ] }); }); diff --git a/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.actions.ts b/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.actions.ts index 679ec56335..c7472cb6f1 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.actions.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.actions.ts @@ -1,11 +1,14 @@ +import { HttpRequest } from '@angular/common/http'; + import { applicationEntityType } from '../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { ApiRequestTypes } from '../../../store/src/reducers/api-request-reducer/request-helpers'; import { PaginatedAction, PaginationParam } from '../../../store/src/types/pagination.types'; import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { AppAutoscalerPolicyLocal, AppScalingTrigger } from './app-autoscaler.types'; +import { AppAutoscalerCredential, AppAutoscalerPolicyLocal, AppScalingTrigger } from './app-autoscaler.types'; import { appAutoscalerAppMetricEntityType, + appAutoscalerCredentialEntityType, appAutoscalerHealthEntityType, appAutoscalerInfoEntityType, appAutoscalerPolicyEntityType, @@ -14,7 +17,6 @@ import { AUTOSCALER_ENDPOINT_TYPE, autoscalerEntityFactory, } from './autoscaler-entity-factory'; -import { HttpRequest } from '@angular/common/http'; export const AppAutoscalerPolicyEvents = { GET_APP_AUTOSCALER_POLICY: '[App Autoscaler] Get autoscaler policy', @@ -45,6 +47,8 @@ export const APP_AUTOSCALER_POLICY_TRIGGER = '[New App Autoscaler] Fetch policy export const CREATE_APP_AUTOSCALER_POLICY = '[New App Autoscaler] Create policy'; export const UPDATE_APP_AUTOSCALER_POLICY = '[New App Autoscaler] Update policy'; export const DETACH_APP_AUTOSCALER_POLICY = '[New App Autoscaler] Detach policy'; +export const UPDATE_APP_AUTOSCALER_CREDENTIAL = '[New App Autoscaler] Update credential'; +export const DELETE_APP_AUTOSCALER_CREDENTIAL = '[New App Autoscaler] Delete credential'; export const APP_AUTOSCALER_HEALTH = '[New App Autoscaler] Fetch Health'; export const APP_AUTOSCALER_SCALING_HISTORY = '[New App Autoscaler] Fetch Scaling History'; export const FETCH_APP_AUTOSCALER_METRIC = '[New App Autoscaler] Fetch Metric'; @@ -235,3 +239,29 @@ export class GetAppAutoscalerAppMetricAction extends GetAppAutoscalerMetricActio } entityType = appAutoscalerAppMetricEntityType; } + +export class UpdateAppAutoscalerCredentialAction implements EntityRequestAction { + static updateKey = 'Updating-Application-Credential'; + constructor( + public guid: string, + public endpointGuid: string, + public credential?: AppAutoscalerCredential, + ) { } + type = UPDATE_APP_AUTOSCALER_CREDENTIAL; + entity = autoscalerEntityFactory(appAutoscalerCredentialEntityType); + entityType = appAutoscalerCredentialEntityType; + endpointType = AUTOSCALER_ENDPOINT_TYPE; + updatingKey = UpdateAppAutoscalerCredentialAction.updateKey; +} + +export class DeleteAppAutoscalerCredentialAction implements EntityRequestAction { + constructor( + public guid: string, + public endpointGuid: string, + ) { } + type = DELETE_APP_AUTOSCALER_CREDENTIAL; + entity = autoscalerEntityFactory(appAutoscalerCredentialEntityType); + entityType = appAutoscalerCredentialEntityType; + endpointType = AUTOSCALER_ENDPOINT_TYPE; + requestType: ApiRequestTypes = 'delete'; +} diff --git a/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.types.ts b/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.types.ts index df8909a37e..fca0b9fcbb 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.types.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/app-autoscaler.types.ts @@ -34,6 +34,7 @@ export interface AppScalingRule { metric_type: string; operator: string; threshold: number; + unit?: string; } export interface AppScalingTrigger { @@ -68,15 +69,6 @@ export interface AppAutoscalerHealth { }; } -export interface AppAutoscalerScalingHistory { - next_url: string; - prev_url: string; - page: number; - resources: AppAutoscalerEvent[]; - total_pages: number; - total_results: number; -} - export interface AppAutoscalerEvent { app_id: string; error: string; @@ -147,6 +139,7 @@ export interface AppAutoscalerFetchPolicyFailedResponse { } export interface AppAutoscalerInvalidPolicyError { + alertInvalidPolicyTriggerMetricName?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerThreshold100?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerThresholdRange?: AppAutoscalerInvalidPolicyErrorEntity; alertInvalidPolicyTriggerStepRange?: AppAutoscalerInvalidPolicyErrorEntity; @@ -162,3 +155,14 @@ export interface AppAutoscalerInvalidPolicyErrorEntity { value?: string | number; } +export interface AppAutoscaleMetricChart { + name: string; + unit: string; +} + +export interface AppAutoscalerCredential { + username: string; + password: string; + app_id?: string; + url?: string; +} diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-factory.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-factory.ts index 1c3cfbc7c5..ecdddc9b8c 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-factory.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-factory.ts @@ -1,6 +1,7 @@ import { Schema, schema } from 'normalizr'; import { getAPIResourceGuid } from '../../../cloud-foundry/src/store/selectors/api.selectors'; +import { metricEntityType } from '../../../core/src/base-entity-schemas'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; export const appAutoscalerInfoEntityType = 'autoscalerInfo'; @@ -9,6 +10,7 @@ export const appAutoscalerPolicyEntityType = 'autoscalerPolicy'; export const appAutoscalerPolicyTriggerEntityType = 'autoscalerPolicyTrigger'; export const appAutoscalerScalingHistoryEntityType = 'autoscalerScalingHistory'; export const appAutoscalerAppMetricEntityType = 'autoscalerAppMetric'; +export const appAutoscalerCredentialEntityType = 'autoscalerCredential' export const AUTOSCALER_ENDPOINT_TYPE = 'autoscaler'; @@ -40,6 +42,12 @@ entityCache[appAutoscalerInfoEntityType] = new AutoscalerEntitySchema( { idAttribute: getAPIResourceGuid } ); +entityCache[appAutoscalerCredentialEntityType] = new AutoscalerEntitySchema( + appAutoscalerCredentialEntityType, + {}, + { idAttribute: getAPIResourceGuid } +); + entityCache[appAutoscalerPolicyEntityType] = new AutoscalerEntitySchema( appAutoscalerPolicyEntityType, {}, @@ -67,6 +75,9 @@ entityCache[appAutoscalerAppMetricEntityType] = new AutoscalerEntitySchema( { idAttribute: getAPIResourceGuid } ); +const MetricSchema = new AutoscalerEntitySchema(metricEntityType); +entityCache[metricEntityType] = MetricSchema; + export function autoscalerEntityFactory(key: string): EntitySchema { const entity = entityCache[key]; if (!entity) { 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 fe10d93c33..9e946fca20 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,22 +1,16 @@ -import { cfEntityFactory } from '../../../cloud-foundry/src/cf-entity-factory'; -import { metricEntityType } from '../../../cloud-foundry/src/cf-entity-types'; import { IOrgFavMetadata } from '../../../cloud-foundry/src/cf-metadata-types'; -import { IOrganization } from '../../../core/src/core/cf-api.types'; +import { metricEntityType } from '../../../core/src/base-entity-schemas'; import { StratosBaseCatalogEntity, StratosCatalogEntity, -} from '../../../store/src/entity-catalog/entity-catalog-entity'; +} from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEndpointDefinition } from '../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../store/src/types/api.types'; import { IFavoriteMetadata } from '../../../store/src/types/user-favorites.types'; -import { - AppAutoscalerHealth, - AppAutoscalerPolicy, - AppAutoscalerScalingHistory, - AppScalingTrigger, -} from './app-autoscaler.types'; +import { AppAutoscalerEvent, AppAutoscalerHealth, AppAutoscalerPolicy, AppScalingTrigger } from './app-autoscaler.types'; import { appAutoscalerAppMetricEntityType, + appAutoscalerCredentialEntityType, appAutoscalerHealthEntityType, appAutoscalerInfoEntityType, appAutoscalerPolicyEntityType, @@ -44,7 +38,8 @@ export function generateASEntities(): StratosBaseCatalogEntity[] { generateHealthEntity(endpointDefinition), generateScalingEntity(endpointDefinition), generateAppMetricEntity(endpointDefinition), - generateMetricEntity(endpointDefinition) + generateMetricEntity(endpointDefinition), + generateCredentialEntity(endpointDefinition), ]; } @@ -57,6 +52,15 @@ function generatePolicyEntity(endpointDefinition: IStratosEndpointDefinition) { return new StratosCatalogEntity>(definition); } +function generateCredentialEntity(endpointDefinition: IStratosEndpointDefinition) { + const definition = { + type: appAutoscalerCredentialEntityType, + schema: autoscalerEntityFactory(appAutoscalerCredentialEntityType), + endpoint: endpointDefinition + }; + return new StratosCatalogEntity>(definition); +} + function generateInfoEntity(endpointDefinition: IStratosEndpointDefinition) { const definition = { type: appAutoscalerInfoEntityType, @@ -90,7 +94,7 @@ function generateScalingEntity(endpointDefinition: IStratosEndpointDefinition) { schema: autoscalerEntityFactory(appAutoscalerScalingHistoryEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition); + return new StratosCatalogEntity>(definition); } function generateAppMetricEntity(endpointDefinition: IStratosEndpointDefinition) { @@ -105,10 +109,10 @@ function generateAppMetricEntity(endpointDefinition: IStratosEndpointDefinition) function generateMetricEntity(endpointDefinition: IStratosEndpointDefinition) { const definition = { type: metricEntityType, - schema: cfEntityFactory(metricEntityType), + schema: autoscalerEntityFactory(metricEntityType), label: 'Autoscaler Metric', labelPlural: 'Autoscaler Metrics', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>(definition); + return new StratosCatalogEntity>(definition); } diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts index dde4382a87..e85527a5cd 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts @@ -6,10 +6,10 @@ import { Observable } from 'rxjs'; import { catchError, mergeMap, withLatestFrom } from 'rxjs/operators'; import { PaginationResponse } from '../../../cloud-foundry/src/store/types/cf-api.types'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; import { environment } from '../../../core/src/environments/environment'; import { isHttpErrorResponse } from '../../../core/src/jetstream.helpers'; import { AppState } from '../../../store/src/app-state'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { ApiRequestTypes } from '../../../store/src/reducers/api-request-reducer/request-helpers'; import { resultPerPageParam, @@ -39,6 +39,8 @@ import { AutoscalerQuery, CREATE_APP_AUTOSCALER_POLICY, CreateAppAutoscalerPolicyAction, + DELETE_APP_AUTOSCALER_CREDENTIAL, + DeleteAppAutoscalerCredentialAction, DETACH_APP_AUTOSCALER_POLICY, DetachAppAutoscalerPolicyAction, FETCH_APP_AUTOSCALER_METRIC, @@ -48,10 +50,13 @@ import { GetAppAutoscalerPolicyAction, GetAppAutoscalerPolicyTriggerAction, GetAppAutoscalerScalingHistoryAction, + UPDATE_APP_AUTOSCALER_CREDENTIAL, UPDATE_APP_AUTOSCALER_POLICY, + UpdateAppAutoscalerCredentialAction, UpdateAppAutoscalerPolicyAction, } from './app-autoscaler.actions'; import { + AppAutoscalerCredential, AppAutoscalerEvent, AppAutoscalerFetchPolicyFailedResponse, AppAutoscalerMetricData, @@ -208,6 +213,61 @@ export class AutoscalerEffects { mergeMap(action => this.fetchPolicy(new GetAppAutoscalerPolicyAction(action.guid, action.endpointGuid), action)) ); + @Effect() + updateAppAutoscalerCredential$ = this.actions$.pipe( + ofType(UPDATE_APP_AUTOSCALER_CREDENTIAL), + mergeMap(action => { + const actionType = 'update'; + this.store.dispatch(new StartRequestAction(action, actionType)); + return this.http.put( + `${commonPrefix}/apps/${action.guid}/credential`, + action.credential, + { + headers: this.addHeaders(action.endpointGuid) + }).pipe( + mergeMap(response => { + const credentialInfo = response; + const entity = entityCatalog.getEntity(action); + const mappedData = { + entities: { [entity.entityKey]: {} }, + result: [] + } as NormalizedResponse; + this.transformData(entity.entityKey, mappedData, action.guid, credentialInfo); + return [ + new WrapperRequestActionSuccess(mappedData, action, actionType) + ]; + }), + catchError(err => [ + new WrapperRequestActionFailed(createAutoscalerErrorMessage('update credential', err), action, actionType) + ])); + })); + + @Effect() + deleteAppAutoscalerCredential$ = this.actions$.pipe( + ofType(DELETE_APP_AUTOSCALER_CREDENTIAL), + mergeMap(action => { + const actionType = 'delete'; + this.store.dispatch(new StartRequestAction(action, actionType)); + return this.http + .delete(`${commonPrefix}/apps/${action.guid}/credential`, { + headers: this.addHeaders(action.endpointGuid) + }).pipe( + mergeMap(response => { + const entity = entityCatalog.getEntity(action); + const mappedData = { + entities: { [entity.entityKey]: {} }, + result: [] + } as NormalizedResponse; + this.transformData(entity.entityKey, mappedData, action.guid, { enabled: false }); + return [ + new WrapperRequestActionSuccess(mappedData, action, actionType) + ]; + }), + catchError(err => [ + new WrapperRequestActionFailed(createAutoscalerErrorMessage('delete credential', err), action, actionType) + ])); + })); + @Effect() fetchAppAutoscalerScalingHistory$ = this.actions$.pipe( ofType(APP_AUTOSCALER_SCALING_HISTORY), diff --git a/src/frontend/packages/cf-autoscaler/tsconfig.lib.prod.json b/src/frontend/packages/cf-autoscaler/tsconfig.lib.prod.json new file mode 100644 index 0000000000..b1d501abbc --- /dev/null +++ b/src/frontend/packages/cf-autoscaler/tsconfig.lib.prod.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.lib.json", + "angularCompilerOptions": { + "enableIvy": false + } +} \ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/actions/app-variables.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/app-variables.actions.ts index 001f34a547..8a9f974710 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/app-variables.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/app-variables.actions.ts @@ -1,7 +1,7 @@ import { Action } from '@ngrx/store'; -import { UpdateApplication } from './application.actions'; import { ListAppEnvVar } from '../shared/components/list/list-types/app-variables/cf-app-variables-data-source'; +import { UpdateApplication } from './application.actions'; export const AppVariables = { UPDATE: '[Application Variables] Update', @@ -12,7 +12,9 @@ export class AppVariablesUpdate implements Action { type = AppVariables.UPDATE; updatedApplication: UpdateApplication; - constructor(public cfGuid: string, public appGuid: string) { } + constructor(public cfGuid: string, public appGuid: string) { + this.guid = 'n/a' // No such thing as an individual app variable guid + } protected createUpdateApplication(allEnvVars: ListAppEnvVar[], selectedItems: ListAppEnvVar[]): UpdateApplication { const updateApp: UpdateApplication = { @@ -26,6 +28,7 @@ export class AppVariablesUpdate implements Action { } return updateApp; } + guid: string; } export class AppVariablesDelete extends AppVariablesUpdate { 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 a7574dedc8..50488bd836 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts @@ -1,14 +1,14 @@ import { HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http'; -import { IApp } from '../../../core/src/core/cf-api.types'; import { pick } from '../../../store/src/helpers/reducer.helper'; import { ActionMergeFunction } from '../../../store/src/types/api.types'; import { PaginatedAction, PaginationParam } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; +import { IApp } from '../cf-api.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { applicationEntityType, appStatsEntityType } from '../cf-entity-types'; import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { EntityInlineParentAction } from '../entity-relations/entity-relations.types'; +import { createEntityRelationPaginationKey, EntityInlineParentAction } from '../entity-relations/entity-relations.types'; import { AppMetadataTypes } from './app-metadata.actions'; import { CFStartAction } from './cf-action.types'; @@ -55,6 +55,7 @@ export class GetAllApplications extends CFStartAction implements PaginatedAction 'GET', 'apps' ); + this.paginationKey = this.paginationKey || createEntityRelationPaginationKey('cf', endpointGuid) } actions = [GET_ALL, GET_ALL_SUCCESS, GET_ALL_FAILED]; entity = [applicationEntitySchema]; diff --git a/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts index e99aab4249..4896e94330 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts @@ -1,11 +1,11 @@ -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { cfInfoEntityType } from '../cf-entity-types'; import { EntityRequestAction } from '../../../store/src/types/request.types'; +import { cfInfoEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; export const GET_CF_INFO = '[CF Endpoint] Get Info'; export class GetCFInfo implements EntityRequestAction { - constructor(public cfGuid: string) { } + constructor(public guid: string) { } type = GET_CF_INFO; endpointType = CF_ENDPOINT_TYPE; entityType = cfInfoEntityType; 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 41a7be9d28..9604b767da 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,10 +1,10 @@ import { Action } from '@ngrx/store'; -import { GitSCM } from '../../../core/src/shared/data-services/scm/scm'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-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'; @@ -14,6 +14,7 @@ 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'; @@ -29,6 +30,10 @@ 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; @@ -54,9 +59,9 @@ export class ProjectExists implements Action { type = PROJECT_EXISTS; } -export class FetchBranchesForProject implements PaginatedAction { - constructor(public scm: GitSCM, public projectName: string) { - this.paginationKey = FetchBranchesForProject.createPaginationKey(scm, projectName); +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, @@ -64,6 +69,20 @@ export class FetchBranchesForProject implements PaginatedAction { 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; diff --git a/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts index 9464841c32..6ec461e70b 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts @@ -1,15 +1,18 @@ import { HttpRequest } from '@angular/common/http'; import { getActions } from '../../../store/src/actions/action.helper'; +import { endpointSchemaKey } from '../../../store/src/helpers/entity-factory'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { RequestEntityLocation } from '../../../store/src/types/request.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { featureFlagEntityType } from '../cf-entity-types'; +import { createEntityRelationPaginationKey } from '../entity-relations/entity-relations.types'; import { CFStartAction } from './cf-action.types'; export class GetAllFeatureFlags extends CFStartAction implements PaginatedAction { - constructor(public endpointGuid: string, public paginationKey: string) { + constructor(public endpointGuid: string, public paginationKey: string = null) { super(); + this.paginationKey = this.paginationKey || createEntityRelationPaginationKey(endpointSchemaKey, this.endpointGuid); this.options = new HttpRequest( 'GET', `config/feature_flags` @@ -21,7 +24,7 @@ export class GetAllFeatureFlags extends CFStartAction implements PaginatedAction entity = [cfEntityFactory(featureFlagEntityType)]; actions = getActions('Feature Flags', 'Fetch all'); options: HttpRequest; - flattenPagination = false; + flattenPagination = true; entityLocation = RequestEntityLocation.ARRAY; initialParams = { page: 1, diff --git a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts index e2a875c49b..c02111909b 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts @@ -1,15 +1,16 @@ -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { gitRepoEntityType } from '../cf-entity-types'; -import { - EnvVarStratosProject, -} from '../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; 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 stProject: EnvVarStratosProject) { } + 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/organization.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/organization.actions.ts index ad7d9b7fa1..ff01a09be0 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/organization.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/organization.actions.ts @@ -1,9 +1,9 @@ import { HttpParams, HttpRequest } from '@angular/common/http'; -import { IUpdateOrganization } from '../../../core/src/core/cf-api.types'; import { getActions } from '../../../store/src/actions/action.helper'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; +import { IUpdateOrganization } from '../cf-api.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { cfUserEntityType, diff --git a/src/frontend/packages/cloud-foundry/src/actions/quota-definitions.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/quota-definitions.actions.ts index 7c5678b1c2..e06451854c 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/quota-definitions.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/quota-definitions.actions.ts @@ -1,15 +1,14 @@ -import { IQuotaDefinition } from '../../../core/src/core/cf-api.types'; -import { - QuotaFormValues, -} from '../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; +import { HttpParams, HttpRequest } from '@angular/common/http'; + import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; -import { CFEntityConfig } from '../cf-types'; +import { IQuotaDefinition } from '../cf-api.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { organizationEntityType, quotaDefinitionEntityType, spaceQuotaEntityType } from '../cf-entity-types'; +import { CFEntityConfig } from '../cf-types'; import { EntityInlineChildAction, EntityInlineParentAction } from '../entity-relations/entity-relations.types'; +import { QuotaFormValues } from '../features/cloud-foundry/quota-definition-form/quota-definition-form.component'; import { CFStartAction } from './cf-action.types'; -import { HttpRequest, HttpParams } from '@angular/common/http'; export const GET_QUOTA_DEFINITION = '[QuotaDefinition] Get one'; export const GET_QUOTA_DEFINITION_SUCCESS = '[QuotaDefinition] Get one success'; diff --git a/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts b/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts new file mode 100644 index 0000000000..f268cc8926 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/actions/relations-actions.ts @@ -0,0 +1,35 @@ +import { Action } from '@ngrx/store'; + +import { APIResponse } from '../../../store/src/actions/request.actions'; +import { PaginatedAction } from '../../../store/src/types/pagination.types'; +import { ICFAction } from '../../../store/src/types/request.types'; +import { ValidationResult } from '../entity-relations/entity-relations.types'; + +type EntitiesPipelineAction = ICFAction | PaginatedAction; + +export const EntitiesPipelineActionTypes = { + VALIDATE: '[Validation] Starting', + COMPLETE: '[Validation] Completed', +}; + +export class CfValidateEntitiesStart implements Action { + type = EntitiesPipelineActionTypes.VALIDATE; + constructor( + public action: EntitiesPipelineAction, + public validateEntities: string[], + ) { + } +} + +export class CfValidateEntitiesComplete implements Action { + type = EntitiesPipelineActionTypes.COMPLETE; + constructor( + public apiAction: EntitiesPipelineAction, + public apiResponse: APIResponse, + public validateAction: CfValidateEntitiesStart, + public validationResult: ValidationResult, + public independentUpdates: boolean + ) { + + } +} \ 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 a0b111c079..275d550eff 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 @@ -16,6 +16,7 @@ import { spaceEntityType, } from '../cf-entity-types'; import { createEntityRelationKey, EntityInlineParentAction } from '../entity-relations/entity-relations.types'; +import { QParam, QParamJoiners } from '../shared/q-param'; import { CFStartAction } from './cf-action.types'; export const DELETE_SERVICE_INSTANCE_ACTIONS = getActions('Service Instances', 'Delete Service Instance'); @@ -114,8 +115,8 @@ export class DeleteServiceInstance extends CFStartAction implements ICFAction { } export class CreateServiceInstance extends CFStartAction implements ICFAction { constructor( - public endpointGuid: string, public guid: string, + public endpointGuid: string, public name: string, public servicePlanGuid: string, public spaceGuid: string, @@ -159,15 +160,15 @@ export class CreateServiceInstance extends CFStartAction implements ICFAction { export class UpdateServiceInstance extends CreateServiceInstance { static updateServiceInstance = 'Updating-Service-Instance'; constructor( - public endpointGuid: string, public guid: string, + public endpointGuid: string, public name: string, public servicePlanGuid: string, public spaceGuid: string, public params: object, public tags: string[], ) { - super(endpointGuid, guid, name, servicePlanGuid, spaceGuid, params, tags, 'PUT', `service_instances/${guid}`); + super(guid, endpointGuid, name, servicePlanGuid, spaceGuid, params, tags, 'PUT', `service_instances/${guid}`); this.actions = getActions('Service Instances', 'Update Service Instance'); } updatingKey = UpdateServiceInstance.updateServiceInstance; @@ -188,8 +189,11 @@ export class ListServiceBindingsForInstance super(); this.options = new HttpRequest( 'GET', - `service_instances/${serviceInstanceGuid}/service_bindings` + `service_bindings` ); + 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)]; @@ -200,6 +204,7 @@ export class ListServiceBindingsForInstance 'results-per-page': 100, 'order-direction': 'desc', 'order-direction-field': 'creation', + q: [] }; flattenPagination = true; } diff --git a/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts index fe68c1700c..dddcc56074 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts @@ -1,7 +1,7 @@ import { HttpRequest } from '@angular/common/http'; import { getActions } from '../../../store/src/actions/action.helper'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { serviceEntityType, servicePlanEntityType } from '../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts index 87ee30f019..444f4e3adf 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts @@ -1,9 +1,9 @@ import { HttpParams, HttpRequest } from '@angular/common/http'; -import { IUpdateSpace } from '../../../core/src/core/cf-api.types'; import { getActions } from '../../../store/src/actions/action.helper'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; +import { IUpdateSpace } from '../cf-api.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { applicationEntityType, @@ -62,6 +62,7 @@ export class GetSpace extends CFStartAction implements ICFAction, EntityInlinePa GET_SPACE_FAILED ]; entity = [cfEntityFactory(spaceEntityType)]; + schemaKey = ''; // Required by builder entityType = spaceEntityType; options: HttpRequest; } diff --git a/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts b/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts index 42ef7c42b9..b4a274ee38 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts @@ -1,13 +1,14 @@ -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { HttpRequest } from '@angular/common/http'; + import { getActions } from '../../../store/src/actions/action.helper'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../store/src/helpers/entity-factory'; -import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; import { stackEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; +import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; import { CFStartAction } from './cf-action.types'; -import { HttpRequest } from '@angular/common/http'; export const GET = '[Stack] Get one'; export const GET_SUCCESS = '[Stack] Get one success'; diff --git a/src/frontend/packages/core/src/core/cf-api-svc.types.ts b/src/frontend/packages/cloud-foundry/src/cf-api-svc.types.ts similarity index 98% rename from src/frontend/packages/core/src/core/cf-api-svc.types.ts rename to src/frontend/packages/cloud-foundry/src/cf-api-svc.types.ts index d841890001..d96017aab4 100644 --- a/src/frontend/packages/core/src/core/cf-api-svc.types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-api-svc.types.ts @@ -1,4 +1,4 @@ -import { APIResource } from '../../../store/src/types/api.types'; +import { APIResource } from '../../store/src/types/api.types'; import { IApp, IOrganization, IRoute, ISpace } from './cf-api.types'; export interface ILastOperation { diff --git a/src/frontend/packages/core/src/core/cf-api.types.ts b/src/frontend/packages/cloud-foundry/src/cf-api.types.ts similarity index 89% rename from src/frontend/packages/core/src/core/cf-api.types.ts rename to src/frontend/packages/cloud-foundry/src/cf-api.types.ts index 9442951898..0ccae9e71a 100644 --- a/src/frontend/packages/core/src/core/cf-api.types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-api.types.ts @@ -1,6 +1,6 @@ -import { CfUser } from '../../../cloud-foundry/src/store/types/user.types'; -import { APIResource } from '../../../store/src/types/api.types'; +import { APIResource } from '../../store/src/types/api.types'; import { IService, IServiceBinding } from './cf-api-svc.types'; +import { CfUser } from './store/types/user.types'; export interface StratosCFEntity { cfGuid: string; @@ -140,8 +140,8 @@ export interface IApp { ports?: number[]; service_bindings?: APIResource[]; routes?: T extends string ? string[] : APIResource[]; - stack?: string | APIResource; - space?: string | APIResource; + stack?: T extends string ? string : APIResource; + space?: T extends string ? string : APIResource; space_url?: string; stack_url?: string; routes_url?: string; @@ -182,6 +182,7 @@ export interface IOrganization { default_isolation_segment_guid?: any; quota_definition_url?: string; spaces_url?: string; + domains?: APIResource[]; domains_url?: string; private_domains_url?: string; users?: APIResource[]; @@ -364,3 +365,20 @@ export interface CfEvent { space_guid?: string; organization_guid?: string; } + +export enum CFFeatureFlagTypes { + user_org_creation = 'user_org_creation', + private_domain_creation = 'private_domain_creation', + app_bits_upload = 'app_bits_upload', + app_scaling = 'app_scaling', + route_creation = 'route_creation', + service_instance_creation = 'service_instance_creation', + diego_docker = 'diego_docker', + set_roles_by_username = 'set_roles_by_username', + unset_roles_by_username = 'unset_roles_by_username', + task_creation = 'task_creation', + env_var_visibility = 'env_var_visibility', + 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 new file mode 100644 index 0000000000..380c47cce7 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts @@ -0,0 +1,247 @@ +import { + StratosBaseCatalogEntity, + StratosCatalogEndpointEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { APIResource } from '../../store/src/types/api.types'; +import { + IService, + IServiceBinding, + IServiceBroker, + IServiceInstance, + IServicePlan, + IServicePlanVisibility, + IUserProvidedServiceInstance, +} from './cf-api-svc.types'; +import { + CfEvent, + IApp, + IAppSummary, + IBuildpack, + ICfV2Info, + IDomain, + IFeatureFlag, + IOrganization, + IOrgQuotaDefinition, + IPrivateDomain, + IRoute, + ISecurityGroup, + ISpace, + ISpaceQuotaDefinition, + IStack, +} from './cf-api.types'; +import { IAppFavMetadata, IBasicCFMetaData, IOrgFavMetadata, 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'; +import { ApplicationActionBuilders } from './entity-action-builders/application.action-builders'; +import { BuildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; +import { CfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; +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'; +import { SecurityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; +import { ServiceBindingActionBuilders } from './entity-action-builders/service-binding.action-builders'; +import { ServiceBrokerActionBuilders } from './entity-action-builders/service-broker.entity-builders'; +import { ServiceInstanceActionBuilders } from './entity-action-builders/service-instance.action.builders'; +import { ServicePlanVisibilityActionBuilders } from './entity-action-builders/service-plan-visibility.action-builders'; +import { ServicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; +import { ServiceActionBuilders } from './entity-action-builders/service.entity-builders'; +import { SpaceQuotaDefinitionActionBuilders } from './entity-action-builders/space-quota.action-builders'; +import { SpaceActionBuilders } from './entity-action-builders/space.action-builders'; +import { StackActionBuilders } from './entity-action-builders/stack-action-builders'; +import { UserProvidedServiceActionBuilder } from './entity-action-builders/user-provided-service.action-builders'; +import { UserActionBuilders } from './entity-action-builders/user.action-builders'; +import { AppStat } from './store/types/app-metadata.types'; +import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; +import { CfUser } from './store/types/user.types'; + +/** + * A strongly typed collection of Cloud Foundry Catalog Entities. + * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc + */ +export class CfEntityCatalog { + public cfEndpoint: StratosCatalogEndpointEntity; + + public quotaDefinition: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + QuotaDefinitionActionBuilder + >; + + public appEnvVar: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + AppEnvVarActionBuilders + >; + + public appSummary: StratosBaseCatalogEntity< + IBasicCFMetaData, + IAppSummary, + AppSummaryActionBuilders + >; + + public spaceQuota: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + SpaceQuotaDefinitionActionBuilders + >; + + public privateDomain: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource + >; + + public cfInfo: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + CfInfoDefinitionActionBuilders + >; + + public appStats: StratosBaseCatalogEntity< + IBasicCFMetaData, + AppStat, + AppStatsActionBuilders + >; + + public buildPack: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + BuildpackActionBuilders + >; + + public serviceBroker: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBrokerActionBuilders + >; + + public servicePlanVisibility: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanVisibilityActionBuilders + >; + + public securityGroup: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + SecurityGroupBuilders + >; + + public serviceBinding: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBindingActionBuilders + >; + + public service: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceActionBuilders + >; + + public servicePlan: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanActionBuilders + >; + + public serviceInstance: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceInstanceActionBuilders + >; + + public user: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + UserActionBuilders + >; + + public domain: StratosBaseCatalogEntity< + IBasicCFMetaData, + 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, + APIResource, + CfEventActionBuilders + >; + + public route: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + RoutesActionBuilders + >; + + public stack: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + StackActionBuilders + >; + + public featureFlag: StratosBaseCatalogEntity< + IBasicCFMetaData, + IFeatureFlag, + FeatureFlagActionBuilders + >; + + public application: StratosBaseCatalogEntity< + IAppFavMetadata, + APIResource, + ApplicationActionBuilders + >; + + public space: StratosBaseCatalogEntity< + ISpaceFavMetadata, + APIResource, + SpaceActionBuilders + >; + + public org: StratosBaseCatalogEntity< + IOrgFavMetadata, + APIResource, + OrganizationActionBuilders + >; + + public metric: StratosBaseCatalogEntity< + IBasicCFMetaData + >; + + public userProvidedService: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + UserProvidedServiceActionBuilder + >; +} + +export const cfEntityCatalog: CfEntityCatalog = new CfEntityCatalog(); 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 6515d83753..0f2d1ebb9e 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts @@ -1,3 +1,4 @@ +import { metricEntityType } from '../../core/src/base-entity-schemas'; import { EntitySchema } from '../../store/src/helpers/entity-schema'; import { APIResource } from '../../store/src/types/api.types'; import { @@ -24,7 +25,6 @@ import { gitBranchesEntityType, gitCommitEntityType, gitRepoEntityType, - metricEntityType, organizationEntityType, privateDomainsEntityType, quotaDefinitionEntityType, @@ -124,9 +124,10 @@ const ServiceBindingsSchema = new CFServiceBindingEntitySchema({ app: new CFApplicationEntitySchema(), service_instance: new CFServiceInstanceEntitySchema({ entity: { - service_bindings: [new CFEntitySchema(serviceBindingEntityType, { - app: new CFApplicationEntitySchema(), - }, { idAttribute: getAPIResourceGuid })], + service_bindings: [ + new CFEntitySchema(serviceBindingEntityType, { + app: new CFApplicationEntitySchema(), + }, { idAttribute: getAPIResourceGuid })], service: new CFEntitySchema(serviceEntityType, {}, { idAttribute: getAPIResourceGuid }), service_plan: ServicePlanSchema, }, 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 8bd4634a96..26a24ca124 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts @@ -1,17 +1,44 @@ -import { Store } from '@ngrx/store'; +import { Action, Store } from '@ngrx/store'; import * as moment from 'moment'; -import { combineLatest, of } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { combineLatest, Observable, of } from 'rxjs'; +import { first, map } from 'rxjs/operators'; +import { EndpointHealthCheck } from '../../core/endpoints-health-checks'; +import { metricEntityType } from '../../core/src/base-entity-schemas'; +import { urlValidationExpression } from '../../core/src/core/utils.service'; +import { BaseEndpointAuth } from '../../core/src/features/endpoints/endpoint-auth'; +import { AppState, GeneralEntityAppState } from '../../store/src/app-state'; +import { + StratosBaseCatalogEntity, + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { + IStratosEntityDefinition, + StratosEndpointExtensionDefinition, +} from '../../store/src/entity-catalog/entity-catalog.types'; +import { + JetstreamError, +} from '../../store/src/entity-request-pipeline/entity-request-base-handlers/handle-multi-endpoints.pipe'; +import { ActionDispatcher, JetstreamResponse } from '../../store/src/entity-request-pipeline/entity-request-pipeline.types'; +import { EntitySchema } from '../../store/src/helpers/entity-schema'; +import { RequestInfoState } from '../../store/src/reducers/api-request-reducer/types'; +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 { CfValidateEntitiesStart } from './actions/relations-actions'; import { IService, IServiceBinding, IServiceBroker, IServiceInstance, IServicePlan, + IServicePlanVisibility, IUserProvidedServiceInstance, -} from '../../core/src/core/cf-api-svc.types'; +} from './cf-api-svc.types'; import { + CfEvent, IApp, IAppSummary, IBuildpack, @@ -26,32 +53,9 @@ import { ISpace, ISpaceQuotaDefinition, IStack, -} from '../../core/src/core/cf-api.types'; -import { urlValidationExpression } from '../../core/src/core/utils.service'; -import { BaseEndpointAuth } from '../../core/src/features/endpoints/endpoint-auth'; -import { AppState } from '../../store/src/app-state'; -import { - StratosBaseCatalogEntity, - StratosCatalogEndpointEntity, - StratosCatalogEntity, -} from '../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; -import { - IStratosEntityDefinition, - StratosEndpointExtensionDefinition, -} from '../../store/src/entity-catalog/entity-catalog.types'; -import { - JetstreamError, -} from '../../store/src/entity-request-pipeline/entity-request-base-handlers/handle-multi-endpoints.pipe'; -import { JetstreamResponse } from '../../store/src/entity-request-pipeline/entity-request-pipeline.types'; -import { EntitySchema } from '../../store/src/helpers/entity-schema'; -import { selectSessionData } from '../../store/src/reducers/auth.reducer'; -import { endpointDisconnectRemoveEntitiesReducer } from '../../store/src/reducers/endpoint-disconnect-application.reducer'; -import { APIResource } from '../../store/src/types/api.types'; -import { PaginatedAction } from '../../store/src/types/pagination.types'; -import { IFavoriteMetadata } from '../../store/src/types/user-favorites.types'; +} from './cf-api.types'; +import { cfEntityCatalog } from './cf-entity-catalog'; import { cfEntityFactory } from './cf-entity-factory'; -import { addCfQParams, addCfRelationParams } from './cf-entity-relations.getters'; import { appEnvVarsEntityType, applicationEntityType, @@ -66,7 +70,6 @@ import { gitBranchesEntityType, gitCommitEntityType, gitRepoEntityType, - metricEntityType, organizationEntityType, privateDomainsEntityType, quotaDefinitionEntityType, @@ -88,45 +91,81 @@ 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 { CF_ENDPOINT_TYPE } from './cf-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'; -import { applicationActionBuilder } from './entity-action-builders/application.action-builders'; -import { buildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; -import { cfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; +import { + AppEnvVarActionBuilders, + appEnvVarActionBuilders, +} from './entity-action-builders/application-env-var.action-builders'; +import { AppStatsActionBuilders, appStatsActionBuilders } from './entity-action-builders/application-stats.action-builders'; +import { + AppSummaryActionBuilders, + appSummaryActionBuilders, +} from './entity-action-builders/application-summary.action-builders'; +import { applicationActionBuilder, ApplicationActionBuilders } from './entity-action-builders/application.action-builders'; +import { BuildpackActionBuilders, buildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; +import { CfEventActionBuilders, cfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; import { CfInfoDefinitionActionBuilders, 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 { 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, + GitRepoActionBuilders, 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'; -import { securityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; -import { serviceBindingActionBuilders } from './entity-action-builders/service-binding.action-builders'; -import { serviceBrokerActionBuilders } from './entity-action-builders/service-broker.entity-builders'; -import { serviceInstanceActionBuilders } from './entity-action-builders/service-instance.action.builders'; -import { servicePlanVisibilityActionBuilders } from './entity-action-builders/service-plan-visibility.action-builders'; -import { servicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; -import { serviceActionBuilders } from './entity-action-builders/service.entity-builders'; -import { spaceQuotaDefinitionActionBuilders } from './entity-action-builders/space-quota.action-builders'; -import { spaceActionBuilders } from './entity-action-builders/space.action-builders'; -import { stackActionBuilders } from './entity-action-builders/stack-action-builders'; -import { userProvidedServiceActionBuilder } from './entity-action-builders/user-provided-service.action-builders'; -import { userActionBuilders } from './entity-action-builders/user.action-builders'; +import { + OrganizationActionBuilders, + organizationActionBuilders, +} from './entity-action-builders/organization.action-builders'; +import { + QuotaDefinitionActionBuilder, + quotaDefinitionActionBuilder, +} from './entity-action-builders/quota-definition.action-builders'; +import { RoutesActionBuilders, routesActionBuilders } from './entity-action-builders/routes.action-builder'; +import { SecurityGroupBuilders, securityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; +import { + ServiceBindingActionBuilders, + serviceBindingActionBuilders, +} from './entity-action-builders/service-binding.action-builders'; +import { + ServiceBrokerActionBuilders, + serviceBrokerActionBuilders, +} from './entity-action-builders/service-broker.entity-builders'; +import { + ServiceInstanceActionBuilders, + serviceInstanceActionBuilders, +} from './entity-action-builders/service-instance.action.builders'; +import { + ServicePlanVisibilityActionBuilders, + servicePlanVisibilityActionBuilders, +} from './entity-action-builders/service-plan-visibility.action-builders'; +import { ServicePlanActionBuilders, servicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; +import { ServiceActionBuilders, serviceActionBuilders } from './entity-action-builders/service.entity-builders'; +import { + SpaceQuotaDefinitionActionBuilders, + spaceQuotaDefinitionActionBuilders, +} from './entity-action-builders/space-quota.action-builders'; +import { SpaceActionBuilders, spaceActionBuilders } from './entity-action-builders/space.action-builders'; +import { StackActionBuilders, stackActionBuilders } from './entity-action-builders/stack-action-builders'; +import { + UserProvidedServiceActionBuilder, + userProvidedServiceActionBuilder, +} from './entity-action-builders/user-provided-service.action-builders'; +import { UserActionBuilders, userActionBuilders } from './entity-action-builders/user.action-builders'; +import { addCfQParams, addCfRelationParams } from './entity-relations/cf-entity-relations.getters'; +import { populatePaginationFromParent } from './entity-relations/entity-relations'; +import { isEntityInlineParentAction } from './entity-relations/entity-relations.types'; import { CfEndpointDetailsComponent } from './shared/components/cf-endpoint-details/cf-endpoint-details.component'; import { updateApplicationRoutesReducer } from './store/reducers/application-route.reducer'; +import { endpointDisconnectRemoveEntitiesReducer } from './store/reducers/endpoint-disconnect-application.reducer'; import { updateOrganizationQuotaReducer } from './store/reducers/organization-quota.reducer'; import { updateOrganizationSpaceReducer } from './store/reducers/organization-space.reducer'; import { routeReducer, updateAppSummaryRoutesReducer } from './store/reducers/routes.reducer'; @@ -138,16 +177,62 @@ import { CFResponse } from './store/types/cf-api.types'; import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; import { CfUser } from './store/types/user.types'; +function safePopulatePaginationFromParent(store: Store, action: PaginatedAction): Observable { + return populatePaginationFromParent(store, action).pipe( + map(newAction => newAction || action) + ); +} + +function getPaginationCompareString(paginationEntity: PaginationEntityState) { + if (!paginationEntity) { + return ''; + } + let params = ''; + if (paginationEntity.params) { + params = JSON.stringify(paginationEntity.params); + } + // paginationEntity.totalResults included to ensure we cover the 'ResetPagination' case, for instance after AddParam + return paginationEntity.totalResults + paginationEntity.currentPage + params + paginationEntity.pageCount; +} + +function shouldValidate(action: ICFAction, isValidated: boolean, entityInfo: RequestInfoState) { + // Validate if.. + // 1) The action is the correct type + const parentAction = isEntityInlineParentAction(action); + if (!parentAction) { + return false; + } + // 2) We have basic request info + // 3) The action states it should not be skipped + // 4) It's already been validated + // 5) There are actual relations to validate + if (!entityInfo || action.skipValidation || isValidated || parentAction.includeRelations.length === 0) { + return false; + } + // 6) The entity isn't in the process of being updated + return !entityInfo.fetching && + !entityInfo.error && + !entityInfo.deleting.busy && + !entityInfo.deleting.deleted && + // This is required to ensure that we don't continue trying to fetch missing relations when we're already fetching missing relations + !Object.keys(entityInfo.updating).find(key => entityInfo.updating[key].busy); +} + export interface CFBasePipelineRequestActionMeta { + /** + * Define a set of children that a cf entity should have, for instance organisation --> space, application --> space --> organisation + */ includeRelations?: string[]; + /** + * If relations, as described in `includeRelations` are missing, should they be fetched? + */ populateMissing?: boolean; + /** + * Only applicable to collections + */ flatten?: boolean; } -export function registerCFEntities() { - generateCFEntities().forEach(entity => entityCatalog.register(entity)); -} - export function generateCFEntities(): StratosBaseCatalogEntity[] { const endpointDefinition: StratosEndpointExtensionDefinition = { urlValidationRegexString: urlValidationExpression, @@ -160,6 +245,8 @@ export function generateCFEntities(): StratosBaseCatalogEntity[] { authTypes: [BaseEndpointAuth.UsernamePassword, BaseEndpointAuth.SSO], listDetailsComponent: CfEndpointDetailsComponent, renderPriority: 1, + healthCheck: new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => cfEntityCatalog.cfInfo.api.get(endpoint.guid)), + favoriteFromEntity: getFavoriteFromCfEntity, globalPreRequest: (request, action) => { return addCfRelationParams(request, action); }, @@ -193,6 +280,39 @@ export function generateCFEntities(): StratosBaseCatalogEntity[] { return message; }, 'Multiple Cloud Foundry Errors. '); }, + entityEmitHandler: (action: ICFAction, dispatcher: ActionDispatcher) => { + let validated = false; + return (entityInfo: EntityInfo) => { + if (!entityInfo || entityInfo.entity) { + if (shouldValidate(action, validated, entityInfo.entityRequestInfo)) { + validated = true; + dispatcher(new CfValidateEntitiesStart( + action, + [action.guid] + )); + } + } + }; + }, + entitiesEmitHandler: (action: PaginatedAction | PaginatedAction[], dispatcher: ActionDispatcher) => { + let lastValidationFootprint: string; + const arrayAction = Array.isArray(action) ? action : [action]; + return (state: PaginationEntityState) => { + const newValidationFootprint = getPaginationCompareString(state); + if (lastValidationFootprint !== newValidationFootprint) { + lastValidationFootprint = newValidationFootprint; + arrayAction.forEach(action => dispatcher(new CfValidateEntitiesStart( + action, + state.ids[action.__forcedPageNumber__ || state.currentPage] + ))); + } + }; + }, + entitiesFetchHandler: (store: Store, actions: PaginatedAction[]) => () => { + combineLatest(actions.map(action => safePopulatePaginationFromParent(store, action))).pipe( + first(), + ).subscribe(actions => actions.forEach(action => store.dispatch(action))); + }, paginationConfig: { getEntitiesFromResponse: (response: CFResponse) => response.resources, getTotalPages: (responseWithPages: JetstreamResponse) => @@ -286,12 +406,17 @@ function generateCFQuotaDefinitionEntity(endpointDefinition: StratosEndpointExte schema: cfEntityFactory(quotaDefinitionEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.quotaDefinition = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + QuotaDefinitionActionBuilder + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: quotaDefinitionActionBuilder }); + return cfEntityCatalog.quotaDefinition; } function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -322,7 +447,12 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD }; }, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appEnvVar = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + AppEnvVarActionBuilders, + AppEnvVarActionBuilders + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -333,8 +463,9 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, - } + }, }); + return cfEntityCatalog.appEnvVar; } function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -343,7 +474,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension schema: cfEntityFactory(appSummaryEntityType), endpoint: endpointDefinition, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appSummary = new StratosCatalogEntity(definition, { dataReducers: [ updateAppSummaryRoutesReducer, endpointDisconnectRemoveEntitiesReducer() @@ -357,6 +488,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension getGuid: metadata => metadata.guid, } }); + return cfEntityCatalog.appSummary; } function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -365,12 +497,16 @@ function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtension schema: cfEntityFactory(spaceQuotaEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: spaceQuotaDefinitionActionBuilders - }); + cfEntityCatalog.spaceQuota = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + SpaceQuotaDefinitionActionBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: spaceQuotaDefinitionActionBuilders + }); + return cfEntityCatalog.spaceQuota; } function generateCFPrivateDomainEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -379,11 +515,12 @@ function generateCFPrivateDomainEntity(endpointDefinition: StratosEndpointExtens schema: cfEntityFactory(privateDomainsEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.privateDomain = new StratosCatalogEntity>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], }); + return cfEntityCatalog.privateDomain; } function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -394,7 +531,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Cloud Foundry Infos', endpoint: endpointDefinition }; - return new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( + cfEntityCatalog.cfInfo = new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( cfInfoDefinition, { dataReducers: [ @@ -410,6 +547,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini } } ); + return cfEntityCatalog.cfInfo; } function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -420,7 +558,11 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos labelPlural: 'User Provided Service Instances', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.userProvidedService = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + UserProvidedServiceActionBuilder + >( definition, { actionBuilders: userProvidedServiceActionBuilder, @@ -430,12 +572,14 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos ], entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid, }), getGuid: metadata => metadata.guid, - } + }, } ); + return cfEntityCatalog.userProvidedService; } function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -470,18 +614,20 @@ function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDe return data; }, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appStats = new StratosCatalogEntity(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: appStatsActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.guid + name: ent.guid, + guid: ent.guid }), getGuid: metadata => metadata.name, } }); + return cfEntityCatalog.appStats; } function generateCFBuildPackEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -490,12 +636,13 @@ function generateCFBuildPackEntity(endpointDefinition: StratosEndpointExtensionD schema: cfEntityFactory(buildpackEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.buildPack = new StratosCatalogEntity, BuildpackActionBuilders>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: buildpackActionBuilders }); + return cfEntityCatalog.buildPack; } function generateCFServiceBrokerEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -504,12 +651,16 @@ function generateCFServiceBrokerEntity(endpointDefinition: StratosEndpointExtens schema: cfEntityFactory(serviceBrokerEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: serviceBrokerActionBuilders - }); + cfEntityCatalog.serviceBroker = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBrokerActionBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: serviceBrokerActionBuilders + }); + return cfEntityCatalog.serviceBroker; } function generateCFServicePlanVisibilityEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -518,12 +669,17 @@ function generateCFServicePlanVisibilityEntity(endpointDefinition: StratosEndpoi schema: cfEntityFactory(servicePlanVisibilityEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.servicePlanVisibility = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanVisibilityActionBuilders + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: servicePlanVisibilityActionBuilders }); + return cfEntityCatalog.servicePlanVisibility; } function generateCFSecurityGroupEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -534,12 +690,16 @@ function generateCFSecurityGroupEntity(endpointDefinition: StratosEndpointExtens labelPlural: 'Security Groups', endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: securityGroupBuilders - }); + cfEntityCatalog.securityGroup = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + SecurityGroupBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: securityGroupBuilders + }); + return cfEntityCatalog.securityGroup; } function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -553,7 +713,11 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten labelPlural: 'Service Bindings', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.serviceBinding = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBindingActionBuilders + >( definition, { dataReducers: [ @@ -562,12 +726,14 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten actionBuilders: serviceBindingActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.metadata.guid + name: ent.metadata.guid, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.serviceBinding; } function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -578,7 +744,11 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef labelPlural: 'Services', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.service = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceActionBuilders + >( definition, { dataReducers: [ @@ -587,12 +757,14 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef actionBuilders: serviceActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.label + name: ent.entity.label, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, - } + }, } ); + return cfEntityCatalog.service; } function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -603,7 +775,11 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio labelPlural: 'Service Plans', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.servicePlan = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanActionBuilders + >( definition, { dataReducers: [ @@ -612,12 +788,14 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio actionBuilders: servicePlanActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.servicePlan; } function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -632,7 +810,11 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte labelPlural: 'Marketplace Service Instances', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.serviceInstance = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceInstanceActionBuilders + >( definition, { dataReducers: [ @@ -642,12 +824,14 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte actionBuilders: serviceInstanceActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.serviceInstance; } function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -658,19 +842,21 @@ function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Users', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.user = new StratosCatalogEntity, UserActionBuilders>( definition, { actionBuilders: userActionBuilders, dataReducers: [userReducer, endpointDisconnectUserReducer], entityBuilder: { getMetadata: ent => ({ - name: ent.entity.username || ent.entity.guid || ent.metadata.guid + name: ent.entity.username || ent.entity.guid || ent.metadata.guid, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.user; } function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -681,7 +867,11 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi labelPlural: 'Domains', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.domain = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + DomainActionBuilders + >( definition, { dataReducers: [ @@ -690,12 +880,14 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi actionBuilders: domainActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.domain; } function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -713,7 +905,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef }; }, }; - return new StratosCatalogEntity( + cfEntityCatalog.gitCommit = new StratosCatalogEntity( definition, { dataReducers: [ @@ -729,6 +921,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef } } ); + return cfEntityCatalog.gitCommit; } function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -739,21 +932,20 @@ function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefin labelPlural: 'Git Repositories', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.gitRepo = new StratosCatalogEntity< + IBasicCFMetaData, + GitRepo, + GitRepoActionBuilders + >( definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: gitRepoActionBuilders, - entityBuilder: { - getMetadata: ent => ({ - name: ent.entity.full_name - }), - getGuid: metadata => metadata.guid, - } } ); + return cfEntityCatalog.gitRepo; } function generateGitBranchEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -764,22 +956,16 @@ function generateGitBranchEntity(endpointDefinition: StratosEndpointExtensionDef labelPlural: 'Git Branches', endpoint: endpointDefinition }; - return new StratosCatalogEntity, GitBranchActionBuilders>( + cfEntityCatalog.gitBranch = new StratosCatalogEntity( definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: gitBranchActionBuilders, - entityBuilder: { - getMetadata: ent => ({ - guid: ent.metadata.guid, - name: ent.metadata.guid, - }), - getGuid: metadata => metadata.guid, - } } ); + return cfEntityCatalog.gitBranch; } function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -790,24 +976,28 @@ function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Events', endpoint: endpointDefinition }; - return new StratosCatalogEntity( - definition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: cfEventActionBuilders, - entityBuilder: { - getMetadata: event => { - return { - guid: event.metadata.guid, - name: event.metadata.guid, - }; - }, - getGuid: metadata => metadata.guid, + cfEntityCatalog.event = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + CfEventActionBuilders>( + definition, + { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: cfEventActionBuilders, + entityBuilder: { + getMetadata: event => { + return { + guid: event.metadata.guid, + name: event.metadata.guid, + }; + }, + getGuid: metadata => metadata.guid, + } } - } - ); + ); + return cfEntityCatalog.event; } function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -818,7 +1008,11 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Application Routes', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.route = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + RoutesActionBuilders + >( definition, { actionBuilders: routesActionBuilders, @@ -835,6 +1029,7 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.route; } function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -845,7 +1040,11 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Stacks', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.stack = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + StackActionBuilders + >( definition, { dataReducers: [ @@ -861,6 +1060,7 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.stack; } function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -890,29 +1090,34 @@ function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionD maxedStateStartAt: () => of(null), } }; - return new StratosCatalogEntity( - featureFlagDefinition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: featureFlagActionBuilders, - entityBuilder: { - getMetadata: ff => ({ - guid: ff.guid, - name: ff.name, - }), - getGuid: metadata => metadata.guid, + cfEntityCatalog.featureFlag = new StratosCatalogEntity< + IBasicCFMetaData, + IFeatureFlag, + FeatureFlagActionBuilders>( + featureFlagDefinition, + { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: featureFlagActionBuilders, + entityBuilder: { + getMetadata: ff => ({ + guid: ff.guid, + name: ff.name, + }), + getGuid: metadata => metadata.guid, + } } - } - ); + ); + return cfEntityCatalog.featureFlag; } function generateCfEndpointEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - return new StratosCatalogEndpointEntity( + cfEntityCatalog.cfEndpoint = new StratosCatalogEndpointEntity( endpointDefinition, metadata => `/cloud-foundry/${metadata.guid}` ); + return cfEntityCatalog.cfEndpoint; } function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -930,7 +1135,11 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio } }; - return new StratosCatalogEntity>( + cfEntityCatalog.application = new StratosCatalogEntity< + IAppFavMetadata, + APIResource, + ApplicationActionBuilders + >( applicationDefinition, { dataReducers: [ @@ -953,6 +1162,7 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio actionBuilders: applicationActionBuilder }, ); + return cfEntityCatalog.application; } function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -966,7 +1176,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin labelPlural: 'Spaces', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.space = new StratosCatalogEntity, SpaceActionBuilders>( spaceDefinition, { actionBuilders: spaceActionBuilders, @@ -991,6 +1201,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin } } ); + return cfEntityCatalog.space; } function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -1001,7 +1212,11 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Organizations', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.org = new StratosCatalogEntity< + IOrgFavMetadata, + APIResource, + OrganizationActionBuilders + >( orgDefinition, { actionBuilders: organizationActionBuilders, @@ -1027,6 +1242,7 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.org; } function getOrgStatus(org: APIResource) { @@ -1044,7 +1260,7 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio labelPlural: 'CF Metrics', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.metric = new StratosCatalogEntity( definition, { dataReducers: [ @@ -1052,4 +1268,5 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio ], } ); + return cfEntityCatalog.metric; } 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 d6dafde146..91555203d5 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-types.ts @@ -1,3 +1,6 @@ +import { IRequestEntityTypeState } from '../../store/src/app-state'; +import { APIResource } from '../../store/src/types/api.types'; +import { BaseEntityValues } from '../../store/src/types/entity.types'; import { IService, IServiceBinding, @@ -6,7 +9,7 @@ import { IServicePlan, IServicePlanVisibility, IUserProvidedServiceInstance, -} from '../../core/src/core/cf-api-svc.types'; +} from './cf-api-svc.types'; import { IApp, IAppSummary, @@ -20,10 +23,7 @@ import { ISpace, ISpaceQuotaDefinition, IStack, -} from '../../core/src/core/cf-api.types'; -import { IRequestEntityTypeState } from '../../store/src/app-state'; -import { APIResource } from '../../store/src/types/api.types'; -import { BaseEntityValues } from '../../store/src/types/entity.types'; +} from './cf-api.types'; import { AppStats } from './store/types/app-metadata.types'; import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; import { CfUser } from './store/types/user.types'; @@ -53,7 +53,6 @@ export const securityGroupEntityType = 'securityGroup'; export const featureFlagEntityType = 'featureFlag'; export const privateDomainsEntityType = 'private_domains'; export const spaceQuotaEntityType = 'space_quota_definition'; -export const metricEntityType = 'metrics'; export const servicePlanVisibilityEntityType = 'servicePlanVisibility'; export const serviceBrokerEntityType = 'serviceBroker'; export const userProvidedServiceInstanceEntityType = 'userProvidedServiceInstance'; diff --git a/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts b/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts new file mode 100644 index 0000000000..05c628ff38 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/cf-favorites-helpers.ts @@ -0,0 +1,25 @@ +import { FavoritesConfigMapper } from '../../core/src/shared/components/favorites-meta-card/favorite-config-mapper'; +import { IEntityMetadata } from '../../store/src/entity-catalog/entity-catalog.types'; +import { UserFavorite } from '../../store/src/types/user-favorites.types'; +import { CfAPIResource } from './store/types/cf-api.types'; + +export function getFavoriteFromCfEntity( + entity, + entityKey: string, + favoritesConfigMapper: FavoritesConfigMapper +): UserFavorite { + if (isCfEntity(entity as CfAPIResource)) { + return favoritesConfigMapper.getFavoriteFromEntity( + entityKey, + '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/core/src/core/cf.helpers.ts b/src/frontend/packages/cloud-foundry/src/cf.helpers.ts similarity index 72% rename from src/frontend/packages/core/src/core/cf.helpers.ts rename to src/frontend/packages/cloud-foundry/src/cf.helpers.ts index 64b0471ecb..ca70a62c1c 100644 --- a/src/frontend/packages/core/src/core/cf.helpers.ts +++ b/src/frontend/packages/cloud-foundry/src/cf.helpers.ts @@ -1,8 +1,6 @@ -import { CfApplicationState } from '../../../cloud-foundry/src/store/types/application.types'; -import { APIResource } from '../../../store/src/types/api.types'; +import { APIResource } from '../../store/src/types/api.types'; import { IApp } from './cf-api.types'; - -// TODO: Move contents to cf cf.helpers.ts #3769 +import { CfApplicationState } from './store/types/application.types'; export function getStartedAppInstanceCount(apps: APIResource[]): number { if (!apps || !apps.length) { 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 a9406f1e60..ae56fa584e 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 @@ -4,13 +4,13 @@ import { EffectsModule } from '@ngrx/effects'; import { generateASEntities } from '../../cf-autoscaler/src/store/autoscaler-entity-generator'; import { generateStratosEntities } from '../../core/src/base-entity-types'; -import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; import { getGitHubAPIURL, GITHUB_API_URL } from '../../core/src/core/github.helpers'; import { LoggerService } from '../../core/src/core/logger.service'; -import { GitSCMService } from '../../core/src/shared/data-services/scm/scm.service'; +import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; +import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { generateCFEntities } from './cf-entity-generator'; 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({ diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts index c37a2f10a3..40bc688274 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts @@ -3,62 +3,20 @@ import { NgModule } from '@angular/core'; import { MDAppModule } from '../../core/src/core/md.module'; import { SharedModule } from '../../core/src/shared/shared.module'; -import { CfValidateEntitiesStart } from '../../store/src/actions/request.actions'; import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; -import { ENTITY_INFO_HANDLER } from '../../store/src/entity-service'; -import { RequestInfoState } from '../../store/src/reducers/api-request-reducer/types'; -import { EntityInfo } from '../../store/src/types/api.types'; -import { ICFAction } from '../../store/src/types/request.types'; import { generateCFEntities } from './cf-entity-generator'; -import { isEntityInlineParentAction } from './entity-relations/entity-relations.types'; import { ApplicationsModule } from './features/applications/applications.module'; import { CloudFoundryModule } from './features/cloud-foundry/cloud-foundry.module'; import { ServiceCatalogModule } from './features/service-catalog/service-catalog.module'; import { ServicesModule } from './features/services/services.module'; -import { CloudFoundryComponentsModule } from './shared/components/components.module'; +import { CloudFoundrySharedModule } from './shared/cf-shared.module'; 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 { 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'; -function shouldValidate(action: ICFAction, isValidated: boolean, entityInfo: RequestInfoState) { - // Validate if.. - // 1) The action is the correct type - const parentAction = isEntityInlineParentAction(action); - if (!parentAction) { - return false; - } - // 2) We have basic request info - // 3) The action states it should not be skipped - // 4) It's already been validated - // 5) There are actual relations to validate - if (!entityInfo || action.skipValidation || isValidated || parentAction.includeRelations.length === 0) { - return false; - } - // 6) The entity isn't in the process of being updated - return !entityInfo.fetching && - !entityInfo.error && - !entityInfo.deleting.busy && - !entityInfo.deleting.deleted && - // This is required to ensure that we don't continue trying to fetch missing relations when we're already fetching missing relations - !Object.keys(entityInfo.updating).find(key => entityInfo.updating[key].busy); -} - -function infoValidator(action: ICFAction, dispatcher) { - let validated = false; - return (entityInfo: EntityInfo) => { - if (!entityInfo || entityInfo.entity) { - if (shouldValidate(action, validated, entityInfo.entityRequestInfo)) { - validated = true; - dispatcher(new CfValidateEntitiesStart( - action, - [action.guid] - )); - } - } - }; -} @NgModule({ imports: [ EntityCatalogModule.forFeature(generateCFEntities), @@ -71,7 +29,7 @@ function infoValidator(action: ICFAction, dispatcher) { ServicesModule, CloudFoundryStoreModule, // FIXME: Ensure that anything lazy loaded is not included here - #3675 - CloudFoundryComponentsModule, + CloudFoundrySharedModule, // FIXME: Move cf effects into cf module - #3675 // EffectsModule.for Root([ // PermissionsEffects, @@ -79,11 +37,11 @@ function infoValidator(action: ICFAction, dispatcher) { // ]) ], providers: [ - { provide: ENTITY_INFO_HANDLER, useFactory: () => infoValidator }, CfUserService, CloudFoundryService, ServiceActionHelperService, - LongRunningCfOperationsService + LongRunningCfOperationsService, + CloudFoundryUserProvidedServicesService ] }) export class CloudFoundryPackageModule { } diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts index 79baa612bd..a52a8cc8fc 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts @@ -1,28 +1,50 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppEnvVarsAction } from '../actions/app-metadata.actions'; +import { AppVariablesAdd, AppVariablesDelete, AppVariablesEdit } from '../actions/app-variables.actions'; import { ListAppEnvVar } from '../shared/components/list/list-types/app-variables/cf-app-variables-data-source'; -import { AppVariablesDelete, AppVariablesEdit, AppVariablesAdd } from '../actions/app-variables.actions'; -// App variables are a special case where the entities are actually embedded in an application.s -// This means that most actions are not standard api actions. -export const appEnvVarActionBuilders = { - get: (appGuid, endpointGuid) => new GetAppEnvVarsAction(appGuid, endpointGuid), - removeFromApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], selectedItems: ListAppEnvVar[]) => new AppVariablesDelete( +export interface AppEnvVarActionBuilders extends OrchestratedActionBuilders { + getMultiple: (appGuid, endpointGuid) => GetAppEnvVarsAction; + removeFromApplication: ( + appGuid, endpointGuid, + allEnvVars: ListAppEnvVar[], + selectedItems: ListAppEnvVar[] + ) => AppVariablesDelete; + editInApplication: ( appGuid, - allEnvVars, - selectedItems - ), - editInApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], editedEnvVar: ListAppEnvVar) => new AppVariablesEdit( endpointGuid, + allEnvVars: ListAppEnvVar[], + editedEnvVar: ListAppEnvVar + ) => AppVariablesEdit; + addNewToApplication: ( appGuid, - allEnvVars, - editedEnvVar - ), - addNewToApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], newEnvVar: ListAppEnvVar) => new AppVariablesAdd( endpointGuid, + allEnvVars: ListAppEnvVar[], + newEnvVar: ListAppEnvVar + ) => AppVariablesAdd; +} + +// App variables are a special case where the entities are actually embedded in an application +// This means that most actions are not standard api actions. +export const appEnvVarActionBuilders: AppEnvVarActionBuilders = { + getMultiple: (appGuid, endpointGuid) => new GetAppEnvVarsAction(appGuid, endpointGuid), + removeFromApplication: ( appGuid, - allEnvVars, - newEnvVar - ) -} as OrchestratedActionBuilders; + endpointGuid, + allEnvVars: ListAppEnvVar[], + selectedItems: ListAppEnvVar[] + ) => new AppVariablesDelete(endpointGuid, appGuid, allEnvVars, selectedItems), + editInApplication: ( + appGuid, + endpointGuid, + allEnvVars: ListAppEnvVar[], + editedEnvVar: ListAppEnvVar + ) => new AppVariablesEdit(endpointGuid, appGuid, allEnvVars, editedEnvVar), + addNewToApplication: ( + appGuid, + endpointGuid, + allEnvVars: ListAppEnvVar[], + newEnvVar: ListAppEnvVar + ) => new AppVariablesAdd(endpointGuid, appGuid, allEnvVars, newEnvVar) +}; 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 edbfe2b26f..44d485252a 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 @@ -1,6 +1,10 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppStatsAction } from '../actions/app-metadata.actions'; -export const appStatsActionBuilders = { - get: (appGuid, endpointGuid) => new GetAppStatsAction(appGuid, endpointGuid) -} as OrchestratedActionBuilders; +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/application-summary.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts index ae90916f50..b62bb28c1c 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts @@ -1,6 +1,10 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppSummaryAction } from '../actions/app-metadata.actions'; -export const appSummaryActionBuilders = { +export interface AppSummaryActionBuilders extends OrchestratedActionBuilders { + get: (appGuid, endpointGuid) => GetAppSummaryAction; +} + +export const appSummaryActionBuilders: AppSummaryActionBuilders = { get: (appGuid, endpointGuid) => new GetAppSummaryAction(appGuid, endpointGuid) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts index 7cd8457d40..58f1173048 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts @@ -1,4 +1,4 @@ -import { IApp } from '../../../core/src/core/cf-api.types'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { AppMetadataTypes } from '../actions/app-metadata.actions'; import { AssignRouteToApplication } from '../actions/application-service-routes.actions'; import { @@ -11,10 +11,29 @@ import { UpdateExistingApplication, } from '../actions/application.actions'; import { GetAllAppsInSpace } from '../actions/space.actions'; +import { IApp } from '../cf-api.types'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface ApplicationActionBuilders extends CFOrchestratedActionBuilders { +export interface ApplicationActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetApplication; + remove: (guid: string, endpointGuid: string) => DeleteApplication; + create: (id: string, endpointGuid: string, application: IApp) => CreateNewApplication; + update: ( + guid: string, + endpointGuid: string, + updatedApplication: UpdateApplication, + existingApplication?: IApp, + updateEntities?: AppMetadataTypes[] + ) => UpdateExistingApplication; + getMultiple: ( + endpointGuid: string, + paginationKey?: string, + { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta + ) => GetAllApplications; restage: (guid: string, endpointGuid: string) => RestageApplication; assignRoute: (endpointGuid: string, routeGuid: string, applicationGuid: string) => AssignRouteToApplication; getAllInSpace: ( @@ -44,7 +63,7 @@ export const applicationActionBuilder: ApplicationActionBuilders = { ) => new UpdateExistingApplication(guid, endpointGuid, updatedApplication, existingApplication, updateEntities), getMultiple: ( endpointGuid: string, - paginationKey: string, + paginationKey?: string, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetAllApplications(paginationKey, endpointGuid, includeRelations, populateMissing), restage: (guid: string, endpointGuid: string) => new RestageApplication(guid, endpointGuid), diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts index d75e557608..9c205cbdf8 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts @@ -1,11 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { FetchAllBuildpacks } from '../actions/buildpack.action'; -export const buildpackActionBuilders = { +export interface BuildpackActionBuilders extends OrchestratedActionBuilders { getMultiple: ( endpointGuid, paginationKey, - ) => new FetchAllBuildpacks(endpointGuid, paginationKey) -} as OrchestratedActionBuilders; - + ) => FetchAllBuildpacks; +} +export const buildpackActionBuilders: BuildpackActionBuilders = { + getMultiple: ( + endpointGuid, + paginationKey, + ) => new FetchAllBuildpacks(endpointGuid, paginationKey) +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts index 95f6dede86..86a6efea47 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts @@ -1,7 +1,7 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetCFInfo } from '../actions/cloud-foundry.actions'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface CfInfoDefinitionActionBuilders extends CFOrchestratedActionBuilders { +export interface CfInfoDefinitionActionBuilders extends OrchestratedActionBuilders { get: (cfGuid: string) => GetCFInfo; } diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts deleted file mode 100644 index 2f3ca87cfa..0000000000 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { PaginatedAction } from '../../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; - -export interface CFOrchestratedActionBuilders extends OrchestratedActionBuilders { - get?( - guid: string, - endpointGuid: string, - meta: CFBasePipelineRequestActionMeta - ): EntityRequestAction; - getMultiple?( - paginationKey: string, - endpointGuid: string, - meta: CFBasePipelineRequestActionMeta - ): PaginatedAction; -} 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 6866da3d44..03dc4fcc43 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 @@ -1,8 +1,27 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { FetchAllDomains, FetchDomain } from '../actions/domains.actions'; +import { GetAllOrganizationDomains } from '../actions/organization.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const domainActionBuilders = { +export interface DomainActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid + ) => FetchDomain; + getMultiple: ( + endpointGuid, + paginationKey, + { flatten }: CFBasePipelineRequestActionMeta + ) => FetchAllDomains; + getOrganizationDomains: ( + orgGuid: string, + endpointGuid: string, + paginationKey?: string, + meta?: CFBasePipelineRequestActionMeta + ) => GetAllOrganizationDomains; +}; + +export const domainActionBuilders: DomainActionBuilders = { get: ( guid, endpointGuid @@ -13,7 +32,16 @@ export const domainActionBuilders = { endpointGuid, paginationKey, { flatten }: CFBasePipelineRequestActionMeta = {} - ) => new FetchAllDomains(endpointGuid, paginationKey, flatten) -} as OrchestratedActionBuilders; + ) => new FetchAllDomains(endpointGuid, paginationKey, flatten), + getOrganizationDomains: ( + orgGuid: string, + endpointGuid: string, + paginationKey: string = null, + meta: CFBasePipelineRequestActionMeta = { + includeRelations: [], + populateMissing: true + } + ) => 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 d594d9c851..65e4d1030b 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 @@ -1,9 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllFeatureFlags } from '../actions/feature-flags.actions'; -export const featureFlagActionBuilders = { +export interface FeatureFlagActionBuilders extends OrchestratedActionBuilders { getMultiple: ( endpointGuid, - paginationKey, + paginationKey?, + ) => GetAllFeatureFlags; +}; + +export const featureFlagActionBuilders: FeatureFlagActionBuilders = { + getMultiple: ( + endpointGuid, + paginationKey?, ) => new GetAllFeatureFlags(endpointGuid, paginationKey) -} as OrchestratedActionBuilders; +}; 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 index a99f04df18..47c2b83a4d 100644 --- 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 @@ -1,32 +1,30 @@ -import { GitSCM } from '../../../core/src/shared/data-services/scm/scm'; import { EntityRequestActionConfig, KnownEntityActionBuilder, OrchestratedActionBuilderConfig, OrchestratedActionBuilders, } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { FetchBranchesForProject, FetchCommits } from '../actions/deploy-applications.actions'; +import { FetchBranchesForProject, FetchBranchForProject, FetchCommits } from '../actions/deploy-applications.actions'; import { FetchGitHubRepoInfo } from '../actions/github.actions'; -import { - EnvVarStratosProject, -} from '../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; +import { GitSCM } from '../shared/data-services/scm/scm'; export interface GitRepoActionBuilders extends OrchestratedActionBuilders { getRepoInfo: ( - projectEnvVars: EnvVarStratosProject + meta: GitMeta ) => FetchGitHubRepoInfo; } export const gitRepoActionBuilders: GitRepoActionBuilders = { getRepoInfo: ( - projectEnvVars: EnvVarStratosProject - ) => new FetchGitHubRepoInfo(projectEnvVars) + meta: GitMeta + ) => new FetchGitHubRepoInfo(meta) }; export interface GitMeta { projectName: string; - scm: GitSCM; + scm: GitSCM; // FIXME: Remove from action, see #4245 commitSha?: string; + branchName?: string; } export interface GitCommitActionBuildersConfig extends OrchestratedActionBuilderConfig { @@ -54,13 +52,33 @@ export const gitCommitActionBuilders: GitCommitActionBuildersConfig = { }; export interface GitBranchActionBuilders extends OrchestratedActionBuilders { - get: (projectName: string, endpointGuid: string, meta: GitMeta) => FetchBranchesForProject; + /** + * 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, - endpointGuid: 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/organization.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts index ed7b3c364f..53336f63f9 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts @@ -1,14 +1,14 @@ -import { IUpdateOrganization } from '../../../core/src/core/cf-api.types'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { DeleteOrganization, GetAllOrganizations, GetOrganization, UpdateOrganization, } from '../actions/organization.actions'; +import { IUpdateOrganization } from '../cf-api.types'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface OrganizationActionBuilders extends CFOrchestratedActionBuilders { +export interface OrganizationActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts index 20f6360368..4641cb90da 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts @@ -1,16 +1,19 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { - QuotaFormValues, -} from '../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; import { CreateQuotaDefinition, - GetOrganizationSpaceQuotaDefinitions, + GetQuotaDefinition, GetQuotaDefinitions, UpdateQuotaDefinition, } from '../actions/quota-definitions.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; +import { QuotaFormValues } from '../features/cloud-foundry/quota-definition-form/quota-definition-form.component'; export interface QuotaDefinitionActionBuilder extends OrchestratedActionBuilders { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetQuotaDefinition; create: ( id: string, endpointGuid: string, @@ -26,16 +29,14 @@ export interface QuotaDefinitionActionBuilder extends OrchestratedActionBuilders endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetQuotaDefinitions; - getOrganizationSpaceQuotaDefinitions: ( - orgGuid: string, - paginationKey: string, - endpointGuid: string, - includeRelations: string[], - populateMissing - ) => GetOrganizationSpaceQuotaDefinitions; } export const quotaDefinitionActionBuilder: QuotaDefinitionActionBuilder = { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => new GetQuotaDefinition(guid, endpointGuid, includeRelations, populateMissing), create: ( id: string, endpointGuid: string, @@ -51,22 +52,5 @@ export const quotaDefinitionActionBuilder: QuotaDefinitionActionBuilder = { endpointGuid: string, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetQuotaDefinitions(paginationKey, endpointGuid, includeRelations, populateMissing), - // associateSpaceQuota: ( - // spaceGuid: string, - // endpointGuid: string, - // spaceQuotaGuid: string - // ) => new AssociateSpaceQuota(spaceGuid, endpointGuid, spaceQuotaGuid), - // disassociateSpaceQuota: ( - // spaceGuid: string, - // endpointGuid: string, - // spaceQuotaGuid: string - // ) => new DisassociateSpaceQuota(spaceGuid, endpointGuid, spaceQuotaGuid), - getOrganizationSpaceQuotaDefinitions: ( - orgGuid: string, - paginationKey: string, - endpointGuid: string, - includeRelations: string[] = [], - populateMissing = true - ) => new GetOrganizationSpaceQuotaDefinitions(paginationKey, orgGuid, endpointGuid, includeRelations, populateMissing) }; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts index 26db5d869d..db9b509492 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts @@ -1,18 +1,19 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { FetchDomain } from '../actions/domains.actions'; import { GetAllSecurityGroups } from '../actions/security-groups-actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const securityGroupBuilders = { - get: ( - guid, - endpointGuid - ) => new FetchDomain(guid, endpointGuid), +export interface SecurityGroupBuilders extends OrchestratedActionBuilders { + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, flatten }: CFBasePipelineRequestActionMeta + ) => GetAllSecurityGroups; +} + +export const securityGroupBuilders: SecurityGroupBuilders = { getMultiple: ( endpointGuid, paginationKey, { includeRelations, flatten }: CFBasePipelineRequestActionMeta = {} ) => new GetAllSecurityGroups(endpointGuid, paginationKey, includeRelations, flatten) -} as OrchestratedActionBuilders; - - +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts index c99496497d..6315ac9595 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts @@ -1,10 +1,10 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppServiceBindings } from '../actions/application-service-routes.actions'; import { CreateServiceBinding, DeleteServiceBinding, FetchAllServiceBindings } from '../actions/service-bindings.actions'; import { ListServiceBindingsForInstance } from '../actions/service-instances.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface ServiceBindingActionBuilders extends CFOrchestratedActionBuilders { +export interface ServiceBindingActionBuilders extends OrchestratedActionBuilders { create: ( id: string, endpointGuid: string, @@ -54,7 +54,7 @@ export const serviceBindingActionBuilders: ServiceBindingActionBuilders = { getMultiple: ( endpointGuid, paginationKey, - { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {}, ) => new FetchAllServiceBindings( endpointGuid, paginationKey, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts index 1be4c4e76e..bce9105cff 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts @@ -2,7 +2,20 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/ac import { GetServiceBroker, GetServiceBrokers } from '../actions/service-broker.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const serviceBrokerActionBuilders = { +export interface ServiceBrokerActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServiceBroker; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServiceBrokers; +} + +export const serviceBrokerActionBuilders: ServiceBrokerActionBuilders = { get: ( guid, endpointGuid, @@ -18,4 +31,4 @@ export const serviceBrokerActionBuilders = { paginationKey, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetServiceBrokers(endpointGuid, paginationKey, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts index 11e42a0533..473139f63e 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts @@ -1,3 +1,4 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { CreateServiceInstance, DeleteServiceInstance, @@ -8,7 +9,6 @@ import { import { GetServicePlanServiceInstances } from '../actions/service-plan.actions'; import { GetServiceInstancesForSpace } from '../actions/space.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; export interface CreateUpdateActionMeta { name: string; @@ -18,7 +18,7 @@ export interface CreateUpdateActionMeta { tags: string[]; } -export interface ServiceInstanceActionBuilders extends CFOrchestratedActionBuilders { +export interface ServiceInstanceActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, 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 1bf3f31d27..fec17c28d2 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 @@ -2,10 +2,18 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/ac import { GetServicePlanVisibilities } from '../actions/service-plan-visibility.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const servicePlanVisibilityActionBuilders = { +export interface ServicePlanVisibilityActionBuilders extends OrchestratedActionBuilders { + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServicePlanVisibilities; +}; + +export const servicePlanVisibilityActionBuilders: ServicePlanVisibilityActionBuilders = { getMultiple: ( endpointGuid, paginationKey, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetServicePlanVisibilities(endpointGuid, paginationKey, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; 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 fea755bb8a..e4b8391296 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 @@ -1,7 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetServicePlansForService } from '../actions/service.actions'; -export const servicePlanActionBuilders = { +export interface ServicePlanActionBuilders extends OrchestratedActionBuilders { + getAllForServiceInstance: ( + serviceGuid: string, + endpointGuid: string, + paginationKey: string, + includeRelations?: string[] + ) => GetServicePlansForService +}; + +export const servicePlanActionBuilders: ServicePlanActionBuilders = { getAllForServiceInstance: ( serviceGuid: string, endpointGuid: string, @@ -13,4 +22,4 @@ export const servicePlanActionBuilders = { paginationKey, includeRelations ) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts index 5f4ada929a..158f6c9c99 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts @@ -3,7 +3,27 @@ import { GetAllServices, GetService } from '../actions/service.actions'; import { GetAllServicesForSpace } from '../actions/space.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const serviceActionBuilders = { +export interface ServiceActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetService; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetAllServices; + getAllInSpace: ( + endpointGuid: string, + paginationKey: string, + spaceGuid: string, + includeRelations?: string[], + populateMissing?: boolean, + ) => GetAllServicesForSpace; +} + +export const serviceActionBuilders: ServiceActionBuilders = { get: ( guid, endpointGuid, @@ -26,4 +46,4 @@ export const serviceActionBuilders = { includeRelations?: string[], populateMissing?: boolean, ) => new GetAllServicesForSpace(paginationKey, endpointGuid, spaceGuid, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; 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 8566696b38..68d96b2c80 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 @@ -1,16 +1,21 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { - QuotaFormValues, -} from '../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; import { AssociateSpaceQuota, CreateSpaceQuotaDefinition, DisassociateSpaceQuota, GetOrganizationSpaceQuotaDefinitions, + GetSpaceQuotaDefinition, UpdateSpaceQuotaDefinition, } from '../actions/quota-definitions.actions'; +import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; +import { QuotaFormValues } from '../features/cloud-foundry/quota-definition-form/quota-definition-form.component'; export interface SpaceQuotaDefinitionActionBuilders extends OrchestratedActionBuilders { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetSpaceQuotaDefinition create: ( id: string, endpointGuid: string, @@ -44,6 +49,11 @@ export interface SpaceQuotaDefinitionActionBuilders extends OrchestratedActionBu } export const spaceQuotaDefinitionActionBuilders: SpaceQuotaDefinitionActionBuilders = { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => new GetSpaceQuotaDefinition(guid, endpointGuid, includeRelations, populateMissing), create: ( id: string, endpointGuid: string, 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 6439af8730..1c265a167a 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 @@ -1,8 +1,11 @@ -import { IUpdateSpace } from '../../../core/src/core/cf-api.types'; import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllOrganizationSpaces } from '../actions/organization.actions'; import { CreateSpace, DeleteSpace, GetAllSpaces, GetSpace, UpdateSpace } from '../actions/space.actions'; +import { IUpdateSpace } from '../cf-api.types'; +import { cfEntityFactory } from '../cf-entity-factory'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; +import { organizationEntityType, spaceEntityType, spaceWithOrgEntityType } from '../cf-entity-types'; +import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; export interface SpaceActionBuilders extends OrchestratedActionBuilders { get: ( @@ -10,6 +13,11 @@ export interface SpaceActionBuilders extends OrchestratedActionBuilders { endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetSpace; + getWithOrganization: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta + ) => GetSpace; remove: ( guid: string, endpointGuid: string, @@ -49,6 +57,24 @@ export const spaceActionBuilders: SpaceActionBuilders = { includeRelations, populateMissing ), + getWithOrganization: ( + guid: string, + endpointGuid: string, + { + includeRelations = [createEntityRelationKey(spaceEntityType, organizationEntityType)], + populateMissing + }: CFBasePipelineRequestActionMeta = {} + ) => { + const action = new GetSpace( + guid, + endpointGuid, + includeRelations || [], + populateMissing + ) + action.entity = [cfEntityFactory(spaceWithOrgEntityType)]; + action.schemaKey = spaceWithOrgEntityType + return action; + }, remove: ( guid, endpointGuid, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts index 4523c78611..e56dd9de38 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts @@ -1,7 +1,7 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllStacks, GetStack } from '../actions/stack.action'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface StackActionBuilders extends CFOrchestratedActionBuilders { +export interface StackActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, 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 01b911c1ad..3ca122c4ff 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 @@ -1,21 +1,32 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; -import { DeleteApplication } from '../actions/application.actions'; import { + CreateUserProvidedServiceInstance, + DeleteUserProvidedInstance, GetAllUserProvidedServices, GetUserProvidedService, IUserProvidedServiceInstanceData, UpdateUserProvidedServiceInstance, } from '../actions/user-provided-service.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface UserProvidedServiceActionBuilder extends CFOrchestratedActionBuilders { + +export interface UserProvidedServiceActionBuilder extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetUserProvidedService; - remove: (guid: string, endpointGuid: string) => DeleteApplication; + create: ( + endpointGuid: string, + guid: string, + data: IUserProvidedServiceInstanceData, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => CreateUserProvidedServiceInstance, + remove: ( + guid: string, + endpointGuid: string, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig + ) => DeleteUserProvidedInstance; update: ( guid: string, endpointGuid: string, @@ -42,7 +53,17 @@ export const userProvidedServiceActionBuilder: UserProvidedServiceActionBuilder endpointGuid, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetUserProvidedService(guid, endpointGuid, includeRelations, populateMissing), - remove: (guid: string, endpointGuid: string) => new DeleteApplication(guid, endpointGuid), + remove: ( + guid: string, + endpointGuid: string, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig + ) => new DeleteUserProvidedInstance(endpointGuid, guid, proxyPaginationEntityConfig), + create: ( + endpointGuid: string, + guid: string, + data: IUserProvidedServiceInstanceData, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => + new CreateUserProvidedServiceInstance(endpointGuid, guid, data, proxyPaginationEntityConfig), update: ( guid: string, endpointGuid: string, @@ -67,5 +88,3 @@ export const userProvidedServiceActionBuilder: UserProvidedServiceActionBuilder populateMissing?: boolean, ) => new GetAllUserProvidedServices(paginationKey, endpointGuid, includeRelations, populateMissing, spaceGuid) }; - - diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts index a580331699..174a9105a0 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts @@ -1,10 +1,10 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllOrgUsers } from '../actions/organization.actions'; import { GetAllSpaceUsers } from '../actions/space.actions'; import { GetAllUsersAsAdmin, GetUser } from '../actions/users.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface UserActionBuilders extends CFOrchestratedActionBuilders { +export interface UserActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string @@ -56,5 +56,4 @@ export const userActionBuilders: UserActionBuilders = { isAdmin: boolean, includeRelations?: string[] ) => new GetAllSpaceUsers(guid, paginationKey, endpointGuid, isAdmin, includeRelations), - }; diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/cf-entity-relations.getters.ts similarity index 80% rename from src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts rename to src/frontend/packages/cloud-foundry/src/entity-relations/cf-entity-relations.getters.ts index 8dd4a54f6d..d8a9527deb 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/cf-entity-relations.getters.ts @@ -1,26 +1,26 @@ import { HttpParams, HttpRequest } from '@angular/common/http'; -import { InternalAppState } from '../../store/src/app-state'; -import { StratosBaseCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; -import { EntityCatalogEntityConfig } from '../../store/src/entity-catalog/entity-catalog.types'; +import { InternalAppState } from '../../../store/src/app-state'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { getPaginationParams, -} from '../../store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe'; -import { selectPaginationState } from '../../store/src/selectors/pagination.selectors'; -import { isPaginatedAction, PaginatedAction, PaginationParam } from '../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../store/src/types/request.types'; -import { listEntityRelations } from './entity-relations/entity-relations'; -import { EntityInlineParentAction, isEntityInlineParentAction } from './entity-relations/entity-relations.types'; -import { QParam } from './shared/q-param'; +} from '../../../store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe'; +import { selectPaginationState } from '../../../store/src/selectors/pagination.selectors'; +import { isPaginatedAction, PaginatedAction, PaginationParam } from '../../../store/src/types/pagination.types'; +import { EntityRequestAction } from '../../../store/src/types/request.types'; +import { QParam } from '../shared/q-param'; +import { listEntityRelations } from './entity-relations'; +import { EntityInlineParentAction, isEntityInlineParentAction } from './entity-relations.types'; -export function getEntityRelationsForEntityRequest(action: EntityInlineParentAction & EntityRequestAction) { +function getEntityRelationsForEntityRequest(action: EntityInlineParentAction & EntityRequestAction) { return listEntityRelations( action, ); } -export function getEntityRelationsForPaginationRequest(action: EntityInlineParentAction & PaginatedAction) { +function getEntityRelationsForPaginationRequest(action: EntityInlineParentAction & PaginatedAction) { if (action.__forcedPageEntityConfig__) { const entityConfig = action.__forcedPageEntityConfig__ as EntityCatalogEntityConfig; const catalogEntity = entityCatalog.getEntity(entityConfig.endpointType, entityConfig.entityType); diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts deleted file mode 100644 index d45bf6e8ee..0000000000 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { ActionState } from '../../../store/src/reducers/api-request-reducer/types'; -import { selectPaginationState } from '../../../store/src/selectors/pagination.selectors'; -import { PaginatedAction, PaginationEntityState } from '../../../store/src/types/pagination.types'; -import { ValidateResultFetchingState } from './entity-relations.types'; - -export function createValidationPaginationWatcher(store, paramPaginationAction: PaginatedAction): - Observable { - return store.select(selectPaginationState(entityCatalog.getEntityKey(paramPaginationAction), paramPaginationAction.paginationKey)).pipe( - map((paginationState: PaginationEntityState) => { - const pageRequest: ActionState = - paginationState && paginationState.pageRequests && paginationState.pageRequests[paginationState.currentPage]; - return { fetching: pageRequest ? pageRequest.busy : true }; - }) - ); -} diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts index a36a993c30..72077db071 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; /** diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts index 7ddbb0378b..a2c6cf1dac 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts @@ -2,29 +2,22 @@ import { inject, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; import { first } from 'rxjs/operators'; -import { ISpace } from '../../../core/src/core/cf-api.types'; -import { - EntityCatalogTestModuleManualStore, - TEST_CATALOGUE_ENTITIES, -} from '../../../store/src/entity-catalog-test.module'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; -import { - createBasicStoreModule, - createEntityStoreState, - TestStoreEntity, -} from '@stratos/store/testing'; import { RequestTypes } from '../../../store/src/actions/request.actions'; import { AppState } from '../../../store/src/app-state'; -import { EntityRelationSpecHelper } from '../../../store/src/helpers/entity-relations/entity-relations-spec-helper'; +import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES } from '../../../store/src/entity-catalog-test.module'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../store/src/types/api.types'; import { WrapperRequestActionSuccess } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; +import { createBasicStoreModule, createEntityStoreState, TestStoreEntity } from '../../../store/testing/public-api'; +import { EntityRelationSpecHelper } from '../../test-framework/entity-relations-spec-helper'; import { GetAllOrganizationSpaces } from '../actions/organization.actions'; +import { ISpace } from '../cf-api.types'; import { CFAppState } from '../cf-app-state'; import { cfEntityFactory } from '../cf-entity-factory'; import { generateCFEntities } from '../cf-entity-generator'; import { organizationEntityType, spaceEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; import { populatePaginationFromParent } from './entity-relations'; diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts index dee44881df..ea5cb3eca5 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts @@ -1,33 +1,25 @@ import { inject, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; +import { createBasicStoreModule, createEntityStoreState, TestStoreEntity } from '@stratos/store/testing'; -import { - EntityCatalogTestModuleManualStore, - TEST_CATALOGUE_ENTITIES, -} from '../../../store/src/entity-catalog-test.module'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { environment } from '../../../core/src/environments/environment'; -import { - createBasicStoreModule, - createEntityStoreState, - TestStoreEntity, -} from '@stratos/store/testing'; import { SetInitialParams } from '../../../store/src/actions/pagination.actions'; import { APIResponse } from '../../../store/src/actions/request.actions'; import { InternalAppState, IRequestTypeState } from '../../../store/src/app-state'; -import { - entityRelationMissingQuotaGuid, - entityRelationMissingQuotaUrl, - entityRelationMissingSpacesUrl, - EntityRelationSpecHelper, -} from '../../../store/src/helpers/entity-relations/entity-relations-spec-helper'; +import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES } from '../../../store/src/entity-catalog-test.module'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { EntityRequestAction, RequestEntityLocation, WrapperRequestActionSuccess, } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; +import { + entityRelationMissingQuotaGuid, + entityRelationMissingQuotaUrl, + entityRelationMissingSpacesUrl, + EntityRelationSpecHelper, +} from '../../test-framework/entity-relations-spec-helper'; import { GetOrganization } from '../actions/organization.actions'; import { FetchRelationPaginatedAction, FetchRelationSingleAction } from '../actions/relation.actions'; import { CFAppState } from '../cf-app-state'; @@ -40,6 +32,7 @@ import { routeEntityType, spaceEntityType, } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; import { EntityTreeRelation } from './entity-relation-tree'; import { validateEntityRelations } from './entity-relations'; import { createEntityRelationKey, createEntityRelationPaginationKey } from './entity-relations.types'; diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.spec.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.spec.ts index a254787c11..63f7a0d46b 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.spec.ts @@ -1,5 +1,5 @@ -import { IOrganization, IOrgQuotaDefinition, ISpace } from '../../../core/src/core/cf-api.types'; import { APIResource } from '../../../store/src/types/api.types'; +import { IOrganization, IOrgQuotaDefinition, ISpace } from '../cf-api.types'; export const entityRelationMissingSpacesUrl = 'spaces_url'; export const entityRelationMissingQuotaGuid = 'quota_guid'; @@ -12,7 +12,8 @@ export class EntityRelationSpecHelper { entity: { name, spaces_url: entityRelationMissingSpacesUrl, - quota_definition_url: entityRelationMissingQuotaUrl + quota_definition_url: entityRelationMissingQuotaUrl, + domains: [] }, metadata: { guid, diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts index d24fc0c48f..2bbdf819b2 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts @@ -8,7 +8,7 @@ import { environment } from '../../../core/src/environments/environment'; import { SetInitialParams } from '../../../store/src/actions/pagination.actions'; import { APIResponse } from '../../../store/src/actions/request.actions'; import { GeneralEntityAppState } from '../../../store/src/app-state'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { isEntityBlocked } from '../../../store/src/entity-service'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; import { pick } from '../../../store/src/helpers/reducer.helper'; @@ -24,7 +24,6 @@ import { } from '../../../store/src/types/request.types'; import { FetchRelationAction, FetchRelationPaginatedAction, FetchRelationSingleAction } from '../actions/relation.actions'; import { EntityTreeRelation } from './entity-relation-tree'; -import { createValidationPaginationWatcher } from './entity-relation-tree.helpers'; import { validationPostProcessor } from './entity-relations-post-processor'; import { fetchEntityTree } from './entity-relations.tree'; import { @@ -144,6 +143,16 @@ function createActionsForExistingEntities(config: HandleRelationsConfig): Action ); } +function createValidationPaginationWatcher(store, paramPaginationAction: PaginatedAction): + Observable { + return store.select(selectPaginationState(entityCatalog.getEntityKey(paramPaginationAction), paramPaginationAction.paginationKey)).pipe( + map((paginationState: PaginationEntityState) => { + const pageRequest = paginationState && paginationState.pageRequests && paginationState.pageRequests[paginationState.currentPage]; + return { fetching: pageRequest ? pageRequest.busy : true }; + }) + ); +} + /** * Create actions required to fetch missing relations */ diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts index ff93962667..557e5ef776 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts @@ -3,7 +3,7 @@ import { map } from 'rxjs/operators'; import { APIResponse } from '../../../../store/src/actions/request.actions'; import { GeneralEntityAppState, GeneralRequestDataState, IRequestEntityTypeState } from '../../../../store/src/app-state'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { deepMergeState, mergeEntity } from '../../../../store/src/helpers/reducer.helper'; import { selectPaginationState } from '../../../../store/src/selectors/pagination.selectors'; import { APIResource } from '../../../../store/src/types/api.types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.spec.ts index 10e739a4d5..7e8ac98783 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.spec.ts @@ -3,8 +3,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { GetApplication } from '../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { generateTestApplicationServiceProvider } from '../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../cf-entity-types'; import { ApplicationsModule } from '../applications.module'; 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 41846a8b01..956f90192e 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 @@ -4,30 +4,28 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, ReplaySubject } from 'rxjs'; import { filter, first, map, pairwise, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; -import { DeleteUserProvidedInstance } from '../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { applicationEntityType, routeEntityType, serviceInstancesEntityType, userProvidedServiceInstanceEntityType, } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { IServiceBinding } from '../../../../../core/src/core/cf-api-svc.types'; -import { IApp, IRoute } from '../../../../../core/src/core/cf-api.types'; import { AppMonitorComponentTypes, } from '../../../../../core/src/shared/components/app-action-monitor-icon/app-action-monitor-icon.component'; import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EntityMonitor } from '../../../../../store/src/monitors/entity-monitor'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitor } from '../../../../../store/src/monitors/pagination-monitor'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; +import { RequestInfoState } from '../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../../cf-api-svc.types'; +import { IApp, IRoute } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { RoutesActionBuilders } from '../../../entity-action-builders/routes.action-builder'; import { CfAppRoutesListConfigService, } from '../../../shared/components/list/list-types/app-route/cf-app-routes-list-config.service'; @@ -172,7 +170,6 @@ export class ApplicationDeleteComponent { private store: Store, private applicationService: ApplicationService, private paginationMonitorFactory: PaginationMonitorFactory, - private entityMonitorFactory: EntityMonitorFactory, private datePipe: DatePipe ) { this.setupAppMonitor(); @@ -204,10 +201,7 @@ export class ApplicationDeleteComponent { startWith(true) ); - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('get'); - const getApplicationAction = actionBuilder(applicationService.appGuid, applicationService.cfGuid); - this.store.dispatch(getApplicationAction); + cfEntityCatalog.application.api.get(applicationService.appGuid, applicationService.cfGuid, {}); } private setupAppMonitor() { @@ -223,46 +217,28 @@ export class ApplicationDeleteComponent { } public getApplicationMonitor() { - return this.entityMonitorFactory.create>( - this.applicationService.appGuid, - { - entityType: applicationEntityType, - endpointType: CF_ENDPOINT_TYPE - } - ); + return cfEntityCatalog.application.store.getEntityMonitor(this.applicationService.appGuid); } + /** * Builds the related entities actions and monitors to monitor the state of the entities. */ public buildRelatedEntitiesActionMonitors() { const { appGuid, cfGuid } = this.applicationService; const instanceAction = AppServiceBindingDataSource.createGetAllServiceBindings(appGuid, cfGuid); - - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const routesAction = actionBuilder(appGuid, cfGuid); - - const instancePaginationKey = instanceAction.paginationKey; - const routesPaginationKey = routesAction.paginationKey; - const instanceMonitor = this.paginationMonitorFactory.create>( - instancePaginationKey, + instanceAction.paginationKey, instanceAction.entity[0], instanceAction.flattenPagination ); - const routeMonitor = this.paginationMonitorFactory.create>( - routesPaginationKey, - routesAction.entity[0], - routesAction.flattenPagination - ); return { fetch: () => { this.store.dispatch(instanceAction); - this.store.dispatch(routesAction); + cfEntityCatalog.route.api.getAllForApplication(appGuid, cfGuid); }, monitors: { instanceMonitor, - routeMonitor + routeMonitor: cfEntityCatalog.route.store.getAllForApplication.getPaginationMonitor(appGuid, cfGuid) } }; } @@ -320,34 +296,22 @@ export class ApplicationDeleteComponent { return this.redirectToAppWall(); } this.deleteStarted = true; - const applicationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = applicationEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteApplicationAction = actionBuilder(this.applicationService.appGuid, this.applicationService.cfGuid); - this.store.dispatch(deleteApplicationAction); - return this.appMonitor.entityRequest$.pipe( + return cfEntityCatalog.application.api.remove(this.applicationService.appGuid, this.applicationService.cfGuid).pipe( filter(request => !request.deleting.busy && (request.deleting.deleted || request.deleting.error)), map((request) => ({ success: request.deleting.deleted })), tap(({ success }) => { if (success) { if (this.selectedRoutes && this.selectedRoutes.length) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const delActionBuilder = routeEntity.actionOrchestrator.getActionBuilder('delete'); this.selectedRoutes.forEach(route => { - const deleteRouteAction = - delActionBuilder(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid); - this.store.dispatch(deleteRouteAction); + cfEntityCatalog.route.api.delete(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid) }); } if (this.selectedServiceInstances && this.selectedServiceInstances.length) { this.selectedServiceInstances.forEach(instance => { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (isUserProvidedServiceInstance(instance.entity.service_instance.entity)) { - this.store.dispatch(new DeleteUserProvidedInstance(this.applicationService.cfGuid, instance.entity.service_instance_guid)); + cfEntityCatalog.userProvidedService.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid) } else { - const remSiActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteServiceInstanceAction = - remSiActionBuilder(this.applicationService.cfGuid, instance.entity.service_instance_guid); - this.store.dispatch(deleteServiceInstanceAction); + 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 60bb59f73e..9c2f0d8ea2 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 @@ -2,30 +2,26 @@ import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, of as observableOf } from 'rxjs'; -import { first, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; -import { FetchAllServiceBindings } from '../../../../../../cloud-foundry/src/actions/service-bindings.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType, serviceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { serviceBindingEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { IServiceBinding } from '../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; import { RowState } from '../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { ListViewTypes } from '../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { ServiceBindingActionBuilders } from '../../../../entity-action-builders/service-binding.action-builders'; +import { IServiceBinding } from '../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AppServiceBindingListConfigService, } from '../../../../shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service'; import { ServiceActionHelperService } from '../../../../shared/data-services/service-action-helper.service'; -import { QParam, QParamJoiners } from '../../../../shared/q-param'; +import { fetchTotalResults } from '../../../cloud-foundry/cf.helpers'; import { ApplicationService } from '../../application.service'; @Injectable() @@ -34,21 +30,6 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin allowSelection: boolean; obsCache: { [serviceGuid: string]: Observable } = {}; - static createFetchServiceBinding = (cfGuid: string, serviceInstanceGuid: string): FetchAllServiceBindings => { - const sgEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = sgEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( - cfGuid, - createEntityRelationPaginationKey(serviceEntityType, serviceInstanceGuid) + '-count', - ); - action.initialParams['results-per-page'] = 1; - action.initialParams.q = [ - new QParam('service_instance_guid', serviceInstanceGuid, QParamJoiners.in).toString(), - ]; - return action; - } - constructor( store: Store, appService: ApplicationService, @@ -75,30 +56,24 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin return observableOf({}); } if (!this.obsCache[serviceBinding.entity.service_instance_guid]) { - const action = AppDeleteServiceInstancesListConfigService.createFetchServiceBinding( + const action = cfEntityCatalog.serviceBinding.actions.getAllForServiceInstance( + serviceBinding.entity.service_instance_guid, appService.cfGuid, - serviceBinding.entity.service_instance_guid - ); - const catalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, action.entityType); - const pagObs = getPaginationObservables({ - store, + createEntityRelationPaginationKey(endpointSchemaKey, serviceBindingEntityType), + { + includeRelations: [], + } + ) + this.obsCache[serviceBinding.entity.service_instance_guid] = fetchTotalResults( action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - catalogEntity.getSchema(), - false - ) - }); - this.obsCache[serviceBinding.entity.service_instance_guid] = pagObs.pagination$.pipe( - map(pag => ({ + store, + this.paginationMonitorFactory + ).pipe( + map(totalResults => ({ disabledReason: 'Service is attached to other applications', - disabled: pag.totalResults > 1 + disabled: totalResults > 1 })) ); - // Ensure the request is made by sub'ing to the entities observable - pagObs.entities$.pipe( - first(), - ).subscribe(); } return this.obsCache[serviceBinding.entity.service_instance_guid]; }; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.spec.ts index 4864ddf0ae..cc133e9d3b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.spec.ts @@ -3,14 +3,15 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { GetApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../../cloud-foundry/src/cf-entity-factory'; -import { generateTestApplicationServiceProvider } from '../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../../cf-entity-types'; import { ServiceActionHelperService } from '../../../../shared/data-services/service-action-helper.service'; import { ApplicationEnvVarsHelper, } from '../../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; +import { ApplicationStateService } from './../../../../shared/services/application-state.service'; import { DeleteAppServiceInstancesComponent } from './delete-app-instances.component'; describe('DeleteAppInstancesComponent', () => { @@ -31,7 +32,8 @@ describe('DeleteAppInstancesComponent', () => { generateTestApplicationServiceProvider(cfId, appId), ApplicationEnvVarsHelper, DatePipe, - ServiceActionHelperService + ServiceActionHelperService, + ApplicationStateService, ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.ts index 04e6dd37d4..0d2fa3e95e 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/delete-app-instances.component.ts @@ -1,9 +1,9 @@ import { Component, EventEmitter, OnDestroy, Output } from '@angular/core'; import { Subscription } from 'rxjs'; -import { IServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../cf-api-svc.types'; import { AppDeleteServiceInstancesListConfigService } from './app-delete-instances-routes-list-config.service'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/app-delete-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/app-delete-routes-list-config.service.ts index fae78a0995..e99d7c41c8 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/app-delete-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/app-delete-routes-list-config.service.ts @@ -4,12 +4,12 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf } from 'rxjs'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { IRoute } from '../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; import { ConfirmationDialogService } from '../../../../../../core/src/shared/components/confirmation-dialog.service'; import { RowState } from '../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IRoute } from '../../../../cf-api.types'; import { CfAppRoutesListConfigServiceBase, } from '../../../../shared/components/list/list-types/app-route/cf-app-routes-list-config-base'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.spec.ts index 2506b0a9fc..28b04b412d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.spec.ts @@ -3,13 +3,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { GetApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../../cloud-foundry/src/cf-entity-factory'; -import { generateTestApplicationServiceProvider } from '../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../../cf-entity-types'; import { ApplicationEnvVarsHelper, } from '../../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; +import { ApplicationStateService } from './../../../../shared/services/application-state.service'; import { DeleteAppRoutesComponent } from './delete-app-routes.component'; describe('DeleteAppRoutesComponent', () => { @@ -29,7 +30,8 @@ describe('DeleteAppRoutesComponent', () => { ), generateTestApplicationServiceProvider(cfId, appId), ApplicationEnvVarsHelper, - DatePipe + DatePipe, + ApplicationStateService ] }) diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.ts index d11933f61c..f53b60cacd 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-routes/delete-app-routes.component.ts @@ -1,9 +1,9 @@ import { Component, EventEmitter, OnDestroy, Output } from '@angular/core'; import { Subscription } from 'rxjs'; -import { IServiceBinding } from '../../../../../../core/src/core/cf-api-svc.types'; import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../../../cf-api-svc.types'; import { AppDeleteRoutesListConfigService } from './app-delete-routes-list-config.service'; @Component({ 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 e2b2120d71..aba0ea3567 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 @@ -6,16 +6,16 @@ import { cfEntityFactory } from '../../../../cloud-foundry/src/cf-entity-factory 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 { ApplicationStateService } from '../../../../core/src/shared/components/application-state/application-state.service'; -import { GitSCMService } from '../../../../core/src/shared/data-services/scm/scm.service'; +import { generateTestEntityServiceProvider } from '../../../../core/test-framework/entity-service.helper'; import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { generateTestApplicationServiceProvider } from '../../../../core/test-framework/application-service-helper'; -import { generateTestEntityServiceProvider } from '../../../../core/test-framework/entity-service.helper'; 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 { applicationEntityType } from '../../cf-entity-types'; 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 61bf728b50..d918209f4f 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 @@ -1,7 +1,7 @@ import { Inject, Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { combineLatest, filter, first, map, publishReplay, refCount, startWith, switchMap } from 'rxjs/operators'; +import { combineLatest, filter, first, map, pairwise, publishReplay, refCount, startWith, switchMap } from 'rxjs/operators'; import { AppMetadataTypes } from '../../../../cloud-foundry/src/actions/app-metadata.actions'; import { @@ -9,46 +9,30 @@ import { UpdateApplication, UpdateExistingApplication, } from '../../../../cloud-foundry/src/actions/application.actions'; -import { GetAllOrganizationDomains } from '../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; import { - appEnvVarsEntityType, applicationEntityType, - appStatsEntityType, - appSummaryEntityType, domainEntityType, organizationEntityType, routeEntityType, serviceBindingEntityType, spaceEntityType, - spaceWithOrgEntityType, stackEntityType, } from '../../../../cloud-foundry/src/cf-entity-types'; -import { IApp, IAppSummary, IDomain, IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; -import { - ApplicationStateData, - ApplicationStateService, -} from '../../../../core/src/shared/components/application-state/application-state.service'; import { APP_GUID, CF_GUID } from '../../../../core/src/shared/entity.tokens'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitor } from '../../../../store/src/monitors/pagination-monitor'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { ActionState, rootUpdatingKey } from '../../../../store/src/reducers/api-request-reducer/types'; import { getCurrentPageRequestInfo, - getPaginationObservables, PaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { selectUpdateInfo } from '../../../../store/src/selectors/api.selectors'; +} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { endpointEntitiesSelector } from '../../../../store/src/selectors/endpoint.selectors'; import { APIResource, EntityInfo } from '../../../../store/src/types/api.types'; -import { PaginatedAction, PaginationEntityState } from '../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../cf-types'; +import { PaginationEntityState } from '../../../../store/src/types/pagination.types'; +import { IApp, IAppSummary, IDomain, IOrganization, ISpace, IStack } from '../../cf-api.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { createEntityRelationKey } from '../../entity-relations/entity-relations.types'; +import { ApplicationStateData, ApplicationStateService } from '../../shared/services/application-state.service'; import { AppStat } from '../../store/types/app-metadata.types'; import { ApplicationEnvVarsHelper, @@ -72,8 +56,8 @@ export function createGetApplicationAction(guid: string, endpointGuid: string) { export interface ApplicationData { fetching: boolean; - app: EntityInfo; - stack: EntityInfo; + app: APIResource; + stack: APIResource; cf: any; } @@ -87,21 +71,20 @@ export class ApplicationService { @Inject(CF_GUID) public cfGuid: string, @Inject(APP_GUID) public appGuid: string, private store: Store, - private entityServiceFactory: EntityServiceFactory, private appStateService: ApplicationStateService, private appEnvVarsService: ApplicationEnvVarsHelper, - private paginationMonitorFactory: PaginationMonitorFactory, ) { - this.appEntityService = this.entityServiceFactory.create>( + this.appEntityService = cfEntityCatalog.application.store.getEntityService( appGuid, - createGetApplicationAction(appGuid, cfGuid) + cfGuid, + { + includeRelations: createGetApplicationAction(appGuid, cfGuid).includeRelations, + populateMissing: true + } ); - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const actionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = actionBuilder(appGuid, cfGuid); - this.appSummaryEntityService = this.entityServiceFactory.create( + this.appSummaryEntityService = cfEntityCatalog.appSummary.store.getEntityService( appGuid, - getAppSummaryAction + cfGuid ); this.constructCoreObservables(); @@ -142,21 +125,11 @@ export class ApplicationService { * Fetch the current state of the app (given it's instances) as an object ready */ static getApplicationState( - store: Store, appStateService: ApplicationStateService, app: IApp, appGuid: string, cfGuid: string): Observable { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const dummyAction = actionBuilder(appGuid, cfGuid) as PaginatedAction; - const paginationMonitor = new PaginationMonitor( - store, - dummyAction.paginationKey, - dummyAction, - dummyAction.flattenPagination - ); - return paginationMonitor.currentPage$.pipe( + return cfEntityCatalog.appStats.store.getPaginationMonitor(appGuid, cfGuid).currentPage$.pipe( map(appInstancesPages => { return appStateService.get(app, appInstancesPages); }) @@ -172,18 +145,9 @@ export class ApplicationService { this.appSpace$ = moreWaiting$.pipe( first(), switchMap(app => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + return cfEntityCatalog.space.store.getWithOrganization.getEntityService( app.space_guid, app.cfGuid, - { includeRelations: [createEntityRelationKey(spaceEntityType, organizationEntityType)], populateMissing: true } - ); - getSpaceAction.entity = cfEntityFactory(spaceWithOrgEntityType); - getSpaceAction.schemaKey = spaceWithOrgEntityType; - return this.entityServiceFactory.create>( - app.space_guid, - getSpaceAction ).waitForEntity$.pipe( map(entityInfo => entityInfo.entity) ); @@ -212,27 +176,14 @@ export class ApplicationService { } public getApplicationEnvVarsMonitor() { - const factory = new EntityMonitorFactory(this.store); - return factory.create>( - this.appGuid, - new CFEntityConfig(appEnvVarsEntityType) - ); + return cfEntityCatalog.appEnvVar.store.getEntityMonitor( + this.appGuid + ) } private constructAmalgamatedObservables() { // Assign/Amalgamate them to public properties (with mangling if required) - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(this.appGuid, this.cfGuid) as PaginatedAction; - const appStats = getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - new CFEntityConfig(appStatsEntityType), - action.flattenPagination - ) - }, true); + 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$; @@ -241,10 +192,10 @@ export class ApplicationService { this.application$ = this.waitForAppEntity$.pipe( combineLatest(this.store.select(endpointEntitiesSelector)), - filter(([{ entity }]: [EntityInfo, any]) => { - return entity && entity.entity && entity.entity.cfGuid; + filter(([entityInfo]) => { + return !!entityInfo && !!entityInfo.entity && !!entityInfo.entity.entity && !!entityInfo.entity.entity.cfGuid; }), - map(([{ entity, entityRequestInfo }, endpoints]: [EntityInfo, any]): ApplicationData => { + map(([{ entity, entityRequestInfo }, endpoints]): ApplicationData => { return { fetching: entityRequestInfo.fetching, app: entity, @@ -270,22 +221,9 @@ export class ApplicationService { // In an ideal world we'd get domains inline with the application, however the inline path from app to org domains exceeds max cf depth // of 2 (app --> space --> org --> domains). this.orgDomains$ = this.appOrg$.pipe( - switchMap(org => { - const domainsAction = new GetAllOrganizationDomains(org.metadata.guid, this.cfGuid); - const paginationMonitor = this.paginationMonitorFactory.create( - domainsAction.paginationKey, - domainsAction, - domainsAction.flattenPagination - ); - return getPaginationObservables>( - { - store: this.store, - action: domainsAction, - paginationMonitor - }, - true - ).entities$; - }), + switchMap(org => + cfEntityCatalog.domain.store.getOrganizationDomains.getPaginationService(org.metadata.guid, this.cfGuid).entities$ + ), publishReplay(1), refCount() ); @@ -345,21 +283,18 @@ export class ApplicationService { updatedApplication: UpdateApplication, updateEntities?: AppMetadataTypes[], existingApplication?: IApp): Observable { - this.store.dispatch(new UpdateExistingApplication( + return cfEntityCatalog.application.api.update( this.appGuid, this.cfGuid, { ...updatedApplication }, existingApplication, updateEntities - )); - - // Create an Observable that can be used to determine when the update completed - const actionState = selectUpdateInfo( - entityCatalog.getEntityKey(CF_ENDPOINT_TYPE, applicationEntityType), - this.appGuid, - UpdateExistingApplication.updateKey + ).pipe( + pairwise(), + filter(([oldS, newS]) => oldS.busy && !newS.busy), + map(([, newS]) => newS), + first() ); - return this.store.select(actionState).pipe(filter(item => !item.busy), first()); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.spec.ts index 0a06f492ae..c906d8833d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.spec.ts @@ -2,10 +2,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../core/src/core/core.module'; -import { - ApplicationStateService, -} from '../../../../../core/src/shared/components/application-state/application-state.service'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../shared/services/application-state.service'; import { ApplicationBaseComponent } from './application-base.component'; import { ApplicationEnvVarsHelper } from './application-tabs-base/tabs/build-tab/application-env-vars.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts index 79b42a6f9f..a95f69f887 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts @@ -3,12 +3,9 @@ import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { - ApplicationStateService, -} from '../../../../../core/src/shared/components/application-state/application-state.service'; import { APP_GUID, CF_GUID, ENTITY_SERVICE } from '../../../../../core/src/shared/entity.tokens'; import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; +import { ApplicationStateService } from '../../../shared/services/application-state.service'; import { ApplicationService, createGetApplicationAction } from '../application.service'; import { ApplicationEnvVarsHelper } from './application-tabs-base/tabs/build-tab/application-env-vars.service'; @@ -16,19 +13,15 @@ export function applicationServiceFactory( cfId: string, id: string, store: Store, - entityServiceFactoryInstance: EntityServiceFactory, appStateService: ApplicationStateService, appEnvVarsService: ApplicationEnvVarsHelper, - paginationMonitorFactory: PaginationMonitorFactory, ) { return new ApplicationService( cfId, id, store, - entityServiceFactoryInstance, appStateService, appEnvVarsService, - paginationMonitorFactory ); } @@ -76,10 +69,8 @@ export function getGuids(type?: string) { CF_GUID, APP_GUID, Store, - EntityServiceFactory, ApplicationStateService, ApplicationEnvVarsHelper, - PaginationMonitorFactory ] }, { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-instance-chart/application-instance-chart.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-instance-chart/application-instance-chart.component.spec.ts index ebdde598a6..07fb0f11ed 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-instance-chart/application-instance-chart.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-instance-chart/application-instance-chart.component.spec.ts @@ -5,6 +5,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySharedModule } from './../../../../shared/cf-shared.module'; import { ApplicationInstanceChartComponent } from './application-instance-chart.component'; describe('ApplicationInstanceChartComponent', () => { @@ -18,6 +19,7 @@ describe('ApplicationInstanceChartComponent', () => { RouterTestingModule, CoreModule, SharedModule, + CloudFoundrySharedModule, NoopAnimationsModule ] }) diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-poll/application-poll.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-poll/application-poll.component.spec.ts index 89d58bc765..096eebe3f7 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-poll/application-poll.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-poll/application-poll.component.spec.ts @@ -1,13 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { generateTestApplicationServiceProvider } from '../../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { GetApplication } from '../../../../../actions/application.actions'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { applicationEntityType } from '../../../../../cf-entity-types'; import { ApplicationPollingService } from '../application-polling.service'; import { ApplicationEnvVarsHelper } from '../tabs/build-tab/application-env-vars.service'; +import { ApplicationStateService } from './../../../../../shared/services/application-state.service'; import { ApplicationPollComponent } from './application-poll.component'; describe('ApplicationPollComponent', () => { @@ -28,7 +29,8 @@ describe('ApplicationPollComponent', () => { new GetApplication(appId, cfId) ), generateTestApplicationServiceProvider(cfId, appId), - ApplicationEnvVarsHelper + ApplicationEnvVarsHelper, + ApplicationStateService, ], imports: generateCfBaseTestModules() }) 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 3796e52a22..39fd632931 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 @@ -3,16 +3,14 @@ import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { appStatsEntityType, appSummaryEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { IApp } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityService } from '../../../../../../store/src/entity-service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { ENTITY_SERVICE } from '../../../../../../core/src/shared/entity.tokens'; import { AppState } from '../../../../../../store/src/app-state'; +import { EntityService } from '../../../../../../store/src/entity-service'; import { selectDashboardState } from '../../../../../../store/src/selectors/dashboard.selectors'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IApp } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationService } from '../../application.service'; @Injectable() @@ -69,7 +67,6 @@ export class ApplicationPollingService { public poll(withApp = false) { const { cfGuid, appGuid } = this.applicationService; - const actionDispatcher = (action) => this.store.dispatch(action); if (withApp) { const updatingApp = { ...this.entityService.action, @@ -80,13 +77,9 @@ export class ApplicationPollingService { this.entityService.entityObs$.pipe( first(), ).subscribe(resource => { - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const appSummaryActionDispatcher = appSummaryEntity.actionOrchestrator.getEntityActionDispatcher(actionDispatcher); - appSummaryActionDispatcher.dispatchGet(appGuid, cfGuid); + cfEntityCatalog.appSummary.api.get(appGuid, cfGuid); if (resource && resource.entity && resource.entity.entity && resource.entity.entity.state === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const appStatsActionDispatcher = appStatsEntity.actionOrchestrator.getEntityActionDispatcher(actionDispatcher); - appStatsActionDispatcher.dispatchGet(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 5a5465658f..55f591b111 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 @@ -10,15 +10,13 @@ import { cfEntityFactory } from '../../../../../../cloud-foundry/src/cf-entity-f 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 { - ApplicationStateService, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../core/tab-nav.service'; -import { generateTestApplicationServiceProvider } from '../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../../cf-entity-types'; +import { ApplicationStateService } from '../../../../shared/services/application-state.service'; import { ApplicationTabsBaseComponent } from './application-tabs-base.component'; import { ApplicationEnvVarsHelper } from './tabs/build-tab/application-env-vars.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 c0b9a3e987..d5b04d1268 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 @@ -6,7 +6,6 @@ import { filter, first, map, startWith, switchMap, withLatestFrom } from 'rxjs/o 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 { IApp, IOrganization, ISpace } from '../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; import { EndpointsService } from '../../../../../../core/src/core/endpoints.service'; @@ -17,20 +16,16 @@ import { StratosActionType, StratosTabType, } from '../../../../../../core/src/core/extension/extension-service'; -import { getFavoriteFromCfEntity } from '../../../../../../core/src/core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../core/src/core/user-favorite-helpers'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { IPageSideNavTab } from '../../../../../../core/src/features/dashboard/page-side-nav/page-side-nav.component'; -import { - ApplicationStateData, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; import { FavoritesConfigMapper, } from '../../../../../../core/src/shared/components/favorites-meta-card/favorite-config-mapper'; import { IHeaderBreadcrumb } from '../../../../../../core/src/shared/components/page-header/page-header.types'; -import { GitSCMService, GitSCMType } from '../../../../../../core/src/shared/data-services/scm/scm.service'; import { ENTITY_SERVICE } from '../../../../../../core/src/shared/entity.tokens'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityService } from '../../../../../../store/src/entity-service'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; @@ -38,7 +33,10 @@ import { endpointEntitiesSelector } from '../../../../../../store/src/selectors/ import { APIResource } from '../../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; 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 { ApplicationService } from '../../application.service'; import { ApplicationPollingService } from './application-polling.service'; @@ -54,7 +52,7 @@ export class ApplicationTabsBaseComponent implements OnInit, OnDestroy { public favorite$ = this.applicationService.app$.pipe( filter(app => !!app), - map(app => getFavoriteFromCfEntity(app.entity, applicationEntityType, this.favoritesConfigMapper)) + map(app => getFavoriteFromEntity(app.entity, applicationEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE)) ); isBusyUpdating$: Observable<{ updating: boolean }>; 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 0eca42f1d8..f3abf44de4 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 @@ -1,18 +1,11 @@ import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { appEnvVarsEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { OverrideAppDetails } from '../../../../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { - getPaginationObservables, PaginationObservables, -} from '../../../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +} from '../../../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; export interface EnvVarStratosProject { @@ -35,24 +28,8 @@ export interface EnvVarStratosProjectSource { @Injectable() export class ApplicationEnvVarsHelper { - constructor( - private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory, - ) { } - createEnvVarsObs(appGuid: string, cfGuid: string): PaginationObservables { - const catalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = catalogEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(appGuid, cfGuid) as PaginatedAction; - return getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - catalogEntity.getSchema(), - action.flattenPagination - ) - }, action.flattenPagination); + return cfEntityCatalog.appEnvVar.store.getPaginationService(appGuid, cfGuid); } FetchStratosProject(appEnvVars): EnvVarStratosProject { 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 68237dbf99..71731cb35b 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 @@ -6,17 +6,15 @@ 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 { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { APP_GUID, CF_GUID, ENTITY_SERVICE } from '../../../../../../../../core/src/shared/entity.tokens'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../../../../core/test-framework/application-service-helper'; import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; 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'; -import { CloudFoundryComponentsModule } from '../../../../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../../../../shared/cf-shared.module'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationService } from '../../../../application.service'; import { cfApplicationEntityServiceFactory } from '../../../application-base.component'; import { ApplicationPollComponent } from '../../application-poll/application-poll.component'; @@ -44,7 +42,7 @@ describe('BuildTabComponent', () => { NoopAnimationsModule, HttpClientModule, HttpClientTestingModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], providers: [ { provide: ApplicationService, useClass: ApplicationServiceMock }, 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 dce77b69da..68a212bce7 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 @@ -4,23 +4,21 @@ import { Store } from '@ngrx/store'; import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; import { combineLatest, delay, distinct, filter, first, map, mergeMap, startWith, tap } from 'rxjs/operators'; -import { AppMetadataTypes, GetAppStatsAction } from '../../../../../../../../cloud-foundry/src/actions/app-metadata.actions'; +import { AppMetadataTypes } from '../../../../../../../../cloud-foundry/src/actions/app-metadata.actions'; import { UpdateExistingApplication } from '../../../../../../../../cloud-foundry/src/actions/application.actions'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { applicationEntityType, appStatsEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IAppSummary } from '../../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { getFullEndpointApiUrl } from '../../../../../../../../core/src/features/endpoints/endpoint-helpers'; import { ConfirmationDialogConfig } from '../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { GitSCMService, GitSCMType } from '../../../../../../../../core/src/shared/data-services/scm/scm.service'; import { ENTITY_SERVICE } from '../../../../../../../../core/src/shared/entity.tokens'; import { ResetPagination } from '../../../../../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../../../../../store/src/entity-service'; import { ActionState } from '../../../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { IAppSummary } from '../../../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; +import { GitSCMService, GitSCMType } from '../../../../../../shared/data-services/scm/scm.service'; import { ApplicationMonitorService } from '../../../../application-monitor.service'; import { ApplicationData, ApplicationService } from '../../../../application.service'; import { DEPLOY_TYPES_IDS } from '../../../../deploy-application/deploy-application-steps.types'; @@ -174,10 +172,7 @@ export class BuildTabComponent implements OnInit { private dispatchAppStats = () => { const { cfGuid, appGuid } = this.applicationService; - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(appGuid, cfGuid); - this.store.dispatch(getAppStatsAction); + cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid); } restartApplication() { @@ -237,21 +232,16 @@ export class BuildTabComponent implements OnInit { this.updateApp(appStopConfirmation, 'stopping', 'STOPPED', () => { // On app reaching the 'STOPPED' state clear the app's stats pagination section const { cfGuid, appGuid } = this.applicationService; - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(appGuid, cfGuid) as GetAppStatsAction; + const getAppStatsAction = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid); this.store.dispatch(new ResetPagination(getAppStatsAction, getAppStatsAction.paginationKey)); }); } restageApplication() { const { cfGuid, appGuid } = this.applicationService; - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('restage'); - const restageAppAction = actionBuilder(appGuid, cfGuid); this.confirmAndPollForState( appRestageConfirmation, - () => this.store.dispatch(restageAppAction), + () => cfEntityCatalog.application.api.restage(appGuid, cfGuid), 'starting', 'STARTED', () => { } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/events-tab/events-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/events-tab/events-tab.component.spec.ts index a7327ca322..e996e1fd9c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/events-tab/events-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/events-tab/events-tab.component.spec.ts @@ -4,9 +4,6 @@ import { Store } from '@ngrx/store'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { MDAppModule } from '../../../../../../../../core/src/core/md.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; import { getPaginationAction, @@ -21,6 +18,7 @@ import { cfEventEntityType } from '../../../../../../cf-entity-types'; import { CloudFoundryEventsListComponent, } from '../../../../../../shared/components/cloud-foundry-events-list/cloud-foundry-events-list.component'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationService } from '../../../../application.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { EventsTabComponent } from './events-tab.component'; 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 cff6701346..81fa6de062 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 @@ -8,9 +8,13 @@ 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 { ApplicationServiceMock } from '../../../../../../../../core/test-framework/application-service-helper'; +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', () => { @@ -18,7 +22,7 @@ describe('GitSCMTabComponent', () => { let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [GitSCMTabComponent], + declarations: [GitSCMTabComponent, GithubCommitAuthorComponent], imports: [ ...generateCfStoreModules(), CoreModule, @@ -32,6 +36,7 @@ describe('GitSCMTabComponent', () => { { provide: ApplicationService, useClass: ApplicationServiceMock }, { provide: GITHUB_API_URL, useFactory: getGitHubAPIURL }, DatePipe, + GitSCMService, ] }) .compileComponents(); 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 32506fe4f9..528965f3c9 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 @@ -5,21 +5,16 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators'; -import { GitCommit, GitRepo } from '../../../../../../../../cloud-foundry/src/store/types/git.types'; -import { - GithubCommitsListConfigServiceAppTab, -} from '../../../../../../../../core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service'; import { ListConfig } from '../../../../../../../../core/src/shared/components/list/list.component.types'; -import { GitSCMService, GitSCMType } from '../../../../../../../../core/src/shared/data-services/scm/scm.service'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; -import { FetchGitHubRepoInfo } from '../../../../../../actions/github.actions'; import { CFAppState } from '../../../../../../cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType, gitRepoEntityType } from '../../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; import { GitMeta } from '../../../../../../entity-action-builders/git-action-builder'; -import { GitBranch } from '../../../../../../store/types/github.types'; +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,11 +29,10 @@ import { EnvVarStratosProject } from '../build-tab/application-env-vars.service' store: Store, datePipe: DatePipe, scmService: GitSCMService, - applicationService: ApplicationService, - entityServiceFactory: EntityServiceFactory) => { - return new GithubCommitsListConfigServiceAppTab(store, datePipe, scmService, applicationService, entityServiceFactory); + applicationService: ApplicationService) => { + return new GithubCommitsListConfigServiceAppTab(store, datePipe, scmService, applicationService); }, - deps: [Store, DatePipe, GitSCMService, ApplicationService, EntityServiceFactory] + deps: [Store, DatePipe, GitSCMService, ApplicationService] } ] }) @@ -71,8 +65,6 @@ export class GitSCMTabComponent implements OnInit, OnDestroy { constructor( private applicationService: ApplicationService, - private store: Store, - private entityServiceFactory: EntityServiceFactory, private snackBar: MatSnackBar, private scmService: GitSCMService ) { } @@ -88,35 +80,20 @@ export class GitSCMTabComponent implements OnInit, OnDestroy { const scmType = stProject.deploySource.scm || stProject.deploySource.type; const scm = this.scmService.getSCM(scmType as GitSCMType); - // Ensure the SCM type is included in the key - const repoEntityID = `${scmType}-${projectName}`; - const commitEntityID = `${repoEntityID}-${commitSha}`; - - const gitRepoEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitRepoEntityType); - const getRepoActionBuilder = gitRepoEntity.actionOrchestrator.getActionBuilder('getRepoInfo'); - const getRepoAction = getRepoActionBuilder(stProject) as FetchGitHubRepoInfo; - this.gitSCMRepoEntityService = this.entityServiceFactory.create( - repoEntityID, - getRepoAction - ); + 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 }; - this.gitCommitEntityService = this.entityServiceFactory.create( - { - endpointType: CF_ENDPOINT_TYPE, - entityType: gitCommitEntityType, - actionMetadata: gitMeta, - entityGuid: commitEntityID, - } - ); + 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: projectName, + branchName: stProject.deploySource.branch + }); - const branchID = `${scmType}-${projectName}-${stProject.deploySource.branch}`; - const gitBranchesEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitBranchesEntityType); - const fetchBranchesActionBuilder = gitBranchesEntity.actionOrchestrator.getActionBuilder('get'); - this.gitBranchEntityService = this.entityServiceFactory.create( - branchID, - fetchBranchesActionBuilder(branchID, null, { projectName, scm }) - ); this.gitSCMRepo$ = this.gitSCMRepoEntityService.waitForEntity$.pipe( map(p => p.entity && p.entity) diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/instances-tab/instances-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/instances-tab/instances-tab.component.spec.ts index ac8cd5ea4a..fc079a8720 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/instances-tab/instances-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/instances-tab/instances-tab.component.spec.ts @@ -1,21 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { testSCFEndpointGuid } from '@stratos/store/testing'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { CF_GUID } from '../../../../../../../../core/src/shared/entity.tokens'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../../../core/test-framework/application-service-helper'; -import { testSCFEndpointGuid } from '@stratos/store/testing'; import { AppStoreModule } from '../../../../../../../../store/src/store.module'; +import { ApplicationServiceMock } from '../../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules, generateTestCfEndpointServiceProvider, } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundryComponentsModule } from '../../../../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../../../../shared/cf-shared.module'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationService } from '../../../../application.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { InstancesTabComponent } from './instances-tab.component'; @@ -33,7 +31,7 @@ describe('InstancesTabComponent', () => { SharedModule, RouterTestingModule, NoopAnimationsModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], providers: [ generateTestCfEndpointServiceProvider(), diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.spec.ts index 8bc76d3ac1..b300ad4f84 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/log-stream-tab/log-stream-tab.component.spec.ts @@ -7,19 +7,15 @@ import { GetApplication } from '../../../../../../../../cloud-foundry/src/action import { cfEntityFactory } from '../../../../../../../../cloud-foundry/src/cf-entity-factory'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { MDAppModule } from '../../../../../../../../core/src/core/md.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { LogViewerComponent } from '../../../../../../../../core/src/shared/components/log-viewer/log-viewer.component'; +import { generateTestEntityServiceProvider } from '../../../../../../../../core/test-framework/entity-service.helper'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { - generateTestApplicationServiceProvider, -} from '../../../../../../../../core/test-framework/application-service-helper'; -import { generateTestEntityServiceProvider } from '../../../../../../../../core/test-framework/entity-service.helper'; 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 { applicationEntityType } from '../../../../../../cf-entity-types'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { LogStreamTabComponent } from './log-stream-tab.component'; 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 866fdf61f7..e4226d87c0 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 @@ -30,7 +30,7 @@ export class LogStreamTabComponent implements OnInit { private connectionStatusSubject = new Subject(); public connectionStatus: Observable; - @ViewChild('searchFilter', { static: false }) searchFilter: NgModel; + @ViewChild('searchFilter') searchFilter: NgModel; filter; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/metrics-tab/metrics-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/metrics-tab/metrics-tab.component.spec.ts index fdc73fff41..6bb64cb28b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/metrics-tab/metrics-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/metrics-tab/metrics-tab.component.spec.ts @@ -4,16 +4,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { GetApplication } from '../../../../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../../../../cloud-foundry/src/cf-entity-factory'; import { MDAppModule } from '../../../../../../../../core/src/core/md.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; -import { - generateTestApplicationServiceProvider, -} from '../../../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../../../../cf-entity-types'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { MetricsTabComponent } from './metrics-tab.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/routes-tab/routes-tab/routes-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/routes-tab/routes-tab/routes-tab.component.spec.ts index ff19f3b799..e24947c5cf 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/routes-tab/routes-tab/routes-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/routes-tab/routes-tab/routes-tab.component.spec.ts @@ -1,12 +1,9 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateTestApplicationServiceProvider, -} from '../../../../../../../../../core/test-framework/application-service-helper'; -import { - generateCfBaseTestModules, -} from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../../../../../test-framework/application-service-helper'; +import { generateCfBaseTestModules } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../../../../shared/services/application-state.service'; import { ApplicationEnvVarsHelper } from '../../build-tab/application-env-vars.service'; import { RoutesTabComponent } from './routes-tab.component'; @@ -21,7 +18,8 @@ describe('RoutesTabComponent', () => { providers: [ generateTestApplicationServiceProvider('test', 'test'), ApplicationEnvVarsHelper, - DatePipe + DatePipe, + ApplicationStateService, ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/services-tab/services-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/services-tab/services-tab.component.spec.ts index 2b562878eb..a608c0b054 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/services-tab/services-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/services-tab/services-tab.component.spec.ts @@ -1,16 +1,12 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { - generateTestApplicationServiceProvider, -} from '../../../../../../../../core/test-framework/application-service-helper'; +import { generateTestApplicationServiceProvider } from '../../../../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ServiceActionHelperService } from '../../../../../../shared/data-services/service-action-helper.service'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { ServicesTabComponent } from './services-tab.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/variables-tab/variables-tab.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/variables-tab/variables-tab.component.spec.ts index 734b270857..08e4ab844a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/variables-tab/variables-tab.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/variables-tab/variables-tab.component.spec.ts @@ -4,12 +4,10 @@ import { StoreModule } from '@ngrx/store'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { MDAppModule } from '../../../../../../../../core/src/core/md.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../../../shared/services/application-state.service'; import { ApplicationService } from '../../../../application.service'; import { ApplicationEnvVarsHelper } from '../build-tab/application-env-vars.service'; import { VariablesTabComponent } from './variables-tab.component'; 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 1440aa2cf8..ec68b659c6 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 @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { ApplicationDeleteComponent } from './application-delete/application-delete.component'; import { DeleteAppServiceInstancesComponent, @@ -43,7 +43,7 @@ import { SshApplicationComponent } from './ssh-application/ssh-application.compo CoreModule, SharedModule, ApplicationsRoutingModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], declarations: [ ApplicationWallComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/cli-info-application/cli-info-application.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/cli-info-application/cli-info-application.component.spec.ts index ed687aef72..c3ead1317a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/cli-info-application/cli-info-application.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/cli-info-application/cli-info-application.component.spec.ts @@ -5,16 +5,14 @@ import { GetApplication } from '../../../../../cloud-foundry/src/actions/applica import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { MDAppModule } from '../../../../../core/src/core/md.module'; -import { - ApplicationStateService, -} from '../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { generateTestApplicationServiceProvider } from '../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../core/test-framework/entity-service.helper'; +import { generateTestApplicationServiceProvider } from '../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../cf-entity-types'; -import { CloudFoundryComponentsModule } from '../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../shared/cf-shared.module'; +import { ApplicationStateService } from '../../../shared/services/application-state.service'; import { ApplicationEnvVarsHelper } from '../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; import { CliInfoApplicationComponent } from './cli-info-application.component'; @@ -34,7 +32,7 @@ describe('CliInfoApplicationComponent', () => { SharedModule, MDAppModule, RouterTestingModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], providers: [ generateTestEntityServiceProvider( diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.spec.ts index 3236d84f37..83db5d9ab7 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.spec.ts @@ -1,5 +1,5 @@ import { CommonModule } 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 { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -7,6 +7,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySharedModule } from '../../../../shared/cf-shared.module'; import { CreateApplicationStep2Component } from './create-application-step2.component'; describe('CreateApplicationStep2Component', () => { @@ -23,6 +24,7 @@ describe('CreateApplicationStep2Component', () => { CommonModule, CoreModule, SharedModule, + CloudFoundrySharedModule, NoopAnimationsModule, HttpClientModule, HttpClientTestingModule, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.ts index 3274819966..09002d671a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step2/create-application-step2.component.ts @@ -7,10 +7,8 @@ import { map } from 'rxjs/operators'; import { SetNewAppName } from '../../../../../../cloud-foundry/src/actions/create-applications-page.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - AppNameUniqueChecking, -} from '../../../../../../core/src/shared/app-name-unique.directive/app-name-unique.directive'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { AppNameUniqueChecking } from '../../../../shared/directives/app-name-unique.directive/app-name-unique.directive'; @Component({ selector: 'app-create-application-step2', diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html index ea2010b0b2..83bce9c427 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html @@ -2,7 +2,7 @@
- + {{ domain.entity.name }} @@ -11,4 +11,4 @@ Host cannot exceed 63 characters -
+ \ No newline at end of file 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 83e6e1575b..3a700a6462 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 @@ -3,27 +3,22 @@ import { AbstractControl, FormControl, FormGroup, Validators } from '@angular/fo import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf } from 'rxjs'; -import { catchError, filter, first, map, mergeMap, switchMap, tap } from 'rxjs/operators'; +import { catchError, filter, first, map, mergeMap, pairwise, switchMap, tap } from 'rxjs/operators'; -import { CreateNewApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - domainEntityType, - organizationEntityType, - routeEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { domainEntityType, organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectNewAppState } from '../../../../../../cloud-foundry/src/store/effects/create-app-effects'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { CreateNewApplicationState } from '../../../../../../cloud-foundry/src/store/types/create-application.types'; -import { IDomain } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { getDefaultRequestState, RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { + ActionState, + getDefaultRequestState, + RequestInfoState, +} from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { IDomain } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../../entity-relations/entity-relations.types'; import { createGetApplicationAction } from '../../application.service'; @@ -40,14 +35,14 @@ export class CreateApplicationStep3Component implements OnInit { setDomainHost: FormGroup; - constructor(private store: Store, private entityServiceFactory: EntityServiceFactory) { + constructor(private store: Store) { this.setDomainHost = new FormGroup({ domain: new FormControl('', [Validators.required]), host: new FormControl({ disabled: true }, [Validators.required, Validators.maxLength(63)]), }); } - domains$: Observable; + domains$: Observable[]>; message = null; @@ -95,14 +90,13 @@ export class CreateApplicationStep3Component implements OnInit { const { cloudFoundry, space } = cloudFoundryDetails; const newAppGuid = name + space; - this.store.dispatch(new CreateNewApplication( + const obs$ = cfEntityCatalog.application.api.create( newAppGuid, cloudFoundry, { name, space_guid: space - } - )); - return this.wrapObservable(this.store.select(selectCfRequestInfo(applicationEntityType, newAppGuid)), 'Could not create application'); + }); + return this.wrapObservable(obs$, 'Could not create application'); } createRoute(): Observable { @@ -115,18 +109,16 @@ export class CreateApplicationStep3Component implements OnInit { const newRouteGuid = hostName + selectedDomainGuid; if (shouldCreate) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('create'); - const createRouteAction = actionBuilder(newRouteGuid, + const obs$ = cfEntityCatalog.route.api.create( + newRouteGuid, cloudFoundry, { space_guid: space, domain_guid: selectedDomainGuid, host: hostName - }); - this.store.dispatch(createRouteAction); - return this.wrapObservable(this.store.select(selectCfRequestInfo(routeEntityType, newRouteGuid)), - 'Application created. Could not create route'); + } + ) + return this.wrapObservable(obs$, 'Application created. Could not create route'); } return observableOf({ ...getDefaultRequestState(), @@ -135,17 +127,25 @@ export class CreateApplicationStep3Component implements OnInit { } associateRoute(appGuid: string, routeGuid: string, endpointGuid: string): Observable { - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('assignRoute'); - const assignRouteAction = actionBuilder(endpointGuid, routeGuid, appGuid); - this.store.dispatch(assignRouteAction); - return this.wrapObservable(this.store.select(selectCfRequestInfo(applicationEntityType, appGuid)), - 'Application and route created. Could not associated route with app'); + const obs$ = cfEntityCatalog.application.api.assignRoute(endpointGuid, routeGuid, appGuid).pipe( + map((actionState: ActionState): RequestInfoState => ({ + creating: actionState.busy, + error: actionState.error, + message: actionState.message, + fetching: null, + updating: null, + deleting: null, + response: null + })) + ) + return this.wrapObservable(obs$, 'Application and route created. Could not associated route with app'); } private wrapObservable(obs$: Observable, errorString: string): Observable { return obs$.pipe( - filter((state: RequestInfoState) => state && !state.creating), + pairwise(), + filter(([oldS, newS]) => oldS.creating && !newS.creating), + map(([, newS]) => newS), first(), tap(state => { if (state.error) { @@ -163,23 +163,18 @@ export class CreateApplicationStep3Component implements OnInit { this.hostControl().setValue(state.name.split(' ').join('-').toLowerCase()); this.hostControl().markAsDirty(); this.newAppData = state; - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(state.cloudFoundryDetails.org, state.cloudFoundryDetails.cloudFoundry, { - includeRelations: [ - createEntityRelationKey(organizationEntityType, domainEntityType) - ], - populateMissing: true - }); - - const orgEntService = this.entityServiceFactory.create>( + + return cfEntityCatalog.org.store.getEntityService( state.cloudFoundryDetails.org, - getOrgAction - ); - return orgEntService.waitForEntity$.pipe( + state.cloudFoundryDetails.cloudFoundry, + { + includeRelations: [createEntityRelationKey(organizationEntityType, domainEntityType)], + populateMissing: true + } + ).waitForEntity$.pipe( map(({ entity }) => { if (!this.domainControl().value && entity.entity.domains && entity.entity.domains.length) { - this.domainControl().setValue(entity.entity.domains[0].entity.guid); + this.domainControl().setValue(entity.entity.domains[0].metadata.guid); this.hostControl().enable(); } return entity.entity.domains; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.spec.ts index c791cea8e5..0d161c70ff 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.component.spec.ts @@ -6,16 +6,17 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../core/src/core/core.module'; +import { SharedModule } from '../../../../../core/src/shared/shared.module'; +import { TabNavService } from '../../../../../core/tab-nav.service'; import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../../../store/src/monitors/internal-event-monitor.factory'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { SharedModule } from '../../../../../core/src/shared/shared.module'; -import { TabNavService } from '../../../../../core/tab-nav.service'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CreateApplicationStep1Component, } from '../../../shared/components/create-application/create-application-step1/create-application-step1.component'; import { CloudFoundryService } from '../../../shared/data-services/cloud-foundry.service'; +import { AppNameUniqueDirective } from '../../../shared/directives/app-name-unique.directive/app-name-unique.directive'; import { CreateApplicationStep2Component } from './create-application-step2/create-application-step2.component'; import { CreateApplicationStep3Component } from './create-application-step3/create-application-step3.component'; import { CreateApplicationComponent } from './create-application.component'; @@ -30,7 +31,8 @@ describe('CreateApplicationComponent', () => { CreateApplicationComponent, CreateApplicationStep1Component, CreateApplicationStep2Component, - CreateApplicationStep3Component + CreateApplicationStep3Component, + AppNameUniqueDirective, ], imports: [ ...generateCfStoreModules(), diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.module.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.module.ts index 9404279b6f..a3dffb7264 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../shared/cf-shared.module'; import { CreateApplicationStep2Component } from './create-application-step2/create-application-step2.component'; import { CreateApplicationStep3Component } from './create-application-step3/create-application-step3.component'; import { CreateApplicationComponent } from './create-application.component'; @@ -13,7 +13,7 @@ import { CreateApplicationComponent } from './create-application.component'; CommonModule, CoreModule, SharedModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], declarations: [ CreateApplicationComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts index 884071a5cf..012e74f265 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts @@ -7,22 +7,17 @@ import { combineLatest, Observable, of as observableOf, Subscription } from 'rxj import { filter, first, map, share, startWith, switchMap } from 'rxjs/operators'; import { SaveAppOverrides } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; -import { GetAllOrganizationDomains } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { stackEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectCfDetails, selectDeployAppState, selectSourceType, } from '../../../../../../cloud-foundry/src/store/selectors/deploy-application.selector'; import { OverrideAppDetails, SourceType } from '../../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { IDomain } from '../../../../../../core/src/core/cf-api.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { IDomain } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationEnvVarsHelper, } from '../../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; @@ -53,7 +48,6 @@ export class DeployApplicationOptionsStepComponent implements OnInit, OnDestroy constructor( private fb: FormBuilder, private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory, private appEnvVarsService: ApplicationEnvVarsHelper, private activatedRoute: ActivatedRoute ) { @@ -130,44 +124,16 @@ export class DeployApplicationOptionsStepComponent implements OnInit, OnDestroy // Create the domains list for the domains drop down this.domains$ = cfDetails$.pipe( - switchMap(cfDetails => { - const action = new GetAllOrganizationDomains(cfDetails.org, cfDetails.cloudFoundry); - return getPaginationObservables>( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$; - }), + switchMap(cfDetails => + cfEntityCatalog.domain.store.getOrganizationDomains.getPaginationService(cfDetails.org, cfDetails.cloudFoundry).entities$ + ), // cf push overrides do not support tcp routes (no way to specify port) map(domains => domains.filter(domain => domain.entity.router_group_type !== 'tcp')), share() ); this.stacks$ = cfDetails$.pipe( - switchMap(cfDetails => { - const stackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, stackEntityType); - const getAllStacksActionBuilder = stackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = getAllStacksActionBuilder(cfDetails.cloudFoundry, null); - return getPaginationObservables>( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$; - }), + switchMap(cfDetails => cfEntityCatalog.stack.store.getPaginationService(null, cfDetails.cloudFoundry).entities$), share() ); 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 fec6ae441c..4d916391d9 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 @@ -6,11 +6,11 @@ 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 '../../../../../../../core/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service'; -import { ListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { GitSCMService } from '../../../../../../../core/src/shared/data-services/scm/scm.service'; +} 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/deploy-application-step2.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.spec.ts index 91c1be15b0..e3089600fd 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.spec.ts @@ -6,9 +6,9 @@ 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 { GitSCMService } from '../../../../../../core/src/shared/data-services/scm/scm.service'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { GitSCMService } from '../../../../shared/data-services/scm/scm.service'; import { ApplicationDeploySourceTypes } from '../deploy-application-steps.types'; import { GithubProjectExistsDirective } from '../github-project-exists.directive'; import { DeployApplicationFsComponent } from './deploy-application-fs/deploy-application-fs.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts index 949bec2fc7..da3babd5ca 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts @@ -4,8 +4,8 @@ import { NgForm } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { - combineLatest as observableCombineLatest, combineLatest, + combineLatest as observableCombineLatest, Observable, of as observableOf, of, @@ -29,7 +29,6 @@ import { } from 'rxjs/operators'; import { - FetchBranchesForProject, ProjectDoesntExist, SaveAppDetails, SetAppSourceDetails, @@ -37,7 +36,6 @@ import { SetDeployBranch, } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectDeployAppState, selectDeployBranchName, @@ -46,21 +44,16 @@ import { selectProjectExists, selectSourceType, } from '../../../../../../cloud-foundry/src/store/selectors/deploy-application.selector'; -import { - DeployApplicationState, - SourceType, -} from '../../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { GitCommit, GitRepo } from '../../../../../../cloud-foundry/src/store/types/git.types'; -import { GitBranch } from '../../../../../../cloud-foundry/src/store/types/github.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { GitSCM } from '../../../../../../core/src/shared/data-services/scm/scm'; -import { GitSCMService, GitSCMType } from '../../../../../../core/src/shared/data-services/scm/scm.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; +import { GitSCM } from '../../../../shared/data-services/scm/scm'; +import { GitSCMService, GitSCMType } from '../../../../shared/data-services/scm/scm.service'; +import { DeployApplicationState, SourceType } from '../../../../store/types/deploy-application.types'; +import { GitBranch, GitCommit, GitRepo } from '../../../../store/types/git.types'; import { ApplicationDeploySourceTypes, DEPLOY_TYPES_IDS } from '../deploy-application-steps.types'; + + @Component({ selector: 'app-deploy-application-step2', templateUrl: './deploy-application-step2.component.html', @@ -121,7 +114,7 @@ export class DeployApplicationStep2Component @ViewChild('sourceSelectionForm', { static: true }) sourceSelectionForm: NgForm; subscriptions: Array = []; - @ViewChild('fsChooser', { static: false }) fsChooser; + @ViewChild('fsChooser') fsChooser; ngOnDestroy() { this.subscriptions.forEach(p => p.unsubscribe()); @@ -131,10 +124,8 @@ export class DeployApplicationStep2Component } constructor( - private entityServiceFactory: EntityServiceFactory, private store: Store, private route: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, private scmService: GitSCMService, private httpClient: HttpClient, private appDeploySourceTypes: ApplicationDeploySourceTypes @@ -258,21 +249,12 @@ export class DeployApplicationStep2Component filter(state => state && !state.checking && !state.error && state.exists), distinctUntilChanged((x, y) => x.name === y.name), // Convert project name into branches pagination observable - switchMap(state => { - const fetchBranchesAction = new FetchBranchesForProject(this.scm, state.name); - return getPaginationObservables( - { - store: this.store, - action: fetchBranchesAction, - paginationMonitor: this.paginationMonitorFactory.create( - fetchBranchesAction.paginationKey, - new CFEntityConfig(gitBranchesEntityType), - true - ) - }, - true - ).entities$; - }), + switchMap(state => + cfEntityCatalog.gitBranch.store.getPaginationService(null, null, { + scm: this.scm, + projectName: state.name + }).entities$ + ), // Find the specific branch we're interested inS withLatestFrom(deployBranchName$), filter(([, branchName]) => !!branchName), @@ -300,17 +282,13 @@ export class DeployApplicationStep2Component if (this.isRedeploy) { const commitSha = commit || branch.commit.sha; - // This method to create entity id's should be standardised.... + // 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 = this.entityServiceFactory.create( - { - endpointType: CF_ENDPOINT_TYPE, - entityType: gitCommitEntityType, - actionMetadata: { projectName: projectInfo.full_name, scm: this.scm, commitSha }, - entityGuid: commitEntityID, - } - ); + const commitEntityService = cfEntityCatalog.gitCommit.store.getEntityService(commitEntityID, null, { + projectName: projectInfo.full_name, + scm: this.scm, commitSha + }) if (this.commitSubscription) { this.commitSubscription.unsubscribe(); 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 2b0e9b4e58..7e34bdc40b 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 @@ -10,14 +10,12 @@ import { } from 'rxjs'; import { filter, first, map, startWith } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; import { DeleteDeployAppSection } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { appEnvVarsEntityType, applicationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; 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'; import { CfOrgSpaceDataService } from '../../../../shared/data-services/cf-org-space-service.service'; import { DeployApplicationDeployer } from '../deploy-application-deployer'; @@ -47,9 +45,6 @@ export class DeployApplicationStep3Component implements OnDestroy { private validSub: Subscription; private busySub: Subscription; - private appEnvVarCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - private appCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - public busy = false; constructor( @@ -84,15 +79,12 @@ export class DeployApplicationStep3Component implements OnDestroy { this.appGuid = guid; // Update the root app wall list - this.appCatalogEntity.actionDispatchManager.dispatchGetMultiple( - null, - CfAppsDataSource.paginationKey, - CfAppsDataSource.includeRelations - ); - // this.store.dispatch(createGetAllAppAction(CfAppsDataSource.paginationKey)); + cfEntityCatalog.application.api.getMultiple(undefined, CfAppsDataSource.paginationKey, { + includeRelations: CfAppsDataSource.includeRelations, + }); + // Pre-fetch the app env vars - this.appEnvVarCatalogEntity.actionDispatchManager.dispatchGet(this.appGuid, this.deployer.cfGuid); - // this.store.dispatch(new GetAppEnvVarsAction(this.appGuid, this.deployer.cfGuid)); + cfEntityCatalog.appEnvVar.api.getMultiple(this.appGuid, this.deployer.cfGuid); }); this.closeable$ = observableCombineLatest( @@ -172,11 +164,10 @@ export class DeployApplicationStep3Component implements OnDestroy { // Take user to applications const { cfGuid } = this.deployer; if (this.appGuid) { - this.appEnvVarCatalogEntity.actionDispatchManager.dispatchGet(this.appGuid, cfGuid); - // this.store.dispatch(new GetAppEnvVarsAction(this.appGuid, cfGuid)); + cfEntityCatalog.appEnvVar.api.getMultiple(this.appGuid, this.deployer.cfGuid); // Ensure the application package_state is correct - this.appCatalogEntity.actionDispatchManager.dispatchGet( + cfEntityCatalog.application.api.get( this.appGuid, cfGuid, { includeRelations: [], populateMissing: false } 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 d991638e17..eee27ea9b6 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 @@ -5,16 +5,11 @@ 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 { IFeatureFlag } from '../../../../../core/src/core/cf-api.types'; import { PermissionConfig, PermissionTypes } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; -import { CFFeatureFlagTypes } from '../../../../../core/src/shared/components/cf-auth/cf-auth.types'; -import { PaginationMonitor } from '../../../../../store/src/monitors/pagination-monitor'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { CFFeatureFlagTypes } from '../../../cf-api.types'; import { CFAppState } from '../../../cf-app-state'; -import { - createCfFeatureFlagFetchAction, -} from '../../../shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; export enum DEPLOY_TYPES_IDS { GITLAB = 'gitlab', @@ -103,20 +98,7 @@ export class ApplicationDeploySourceTypes { // We don't want to return until we have a trusted response (there's a `startsWith(false)` in the `.can`), otherwise we return false // then, if different, send the actual response (this leads to flashing misleading info in ux) // So fetch the feature flags for the cf, which is the blocker, first before checking if we `.can` - const action = createCfFeatureFlagFetchAction(cfId); - const fetchedFeatureFlags$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: new PaginationMonitor( - this.store, - action.paginationKey, - action, - true - ) - }, - true - ).entities$.pipe( + const fetchedFeatureFlags$ = cfEntityCatalog.featureFlag.store.getPaginationService(cfId).entities$.pipe( map(entities => !!entities), filter(hasEntities => hasEntities), first(), 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 05f643078b..109a98e22f 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 @@ -9,7 +9,7 @@ import { getGitHubAPIURL, GITHUB_API_URL } from '../../../../../core/src/core/gi import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundryComponentsModule } from '../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../shared/cf-shared.module'; import { CfOrgSpaceDataService } from '../../../shared/data-services/cf-org-space-service.service'; import { ApplicationEnvVarsHelper } from '../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; import { CreateApplicationModule } from '../create-application/create-application.module'; @@ -69,7 +69,7 @@ describe('DeployApplicationComponent', () => { HttpClientModule, HttpClientTestingModule, HttpClientModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.module.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.module.ts index e3c316dd51..5b7e64475c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../../shared/cf-shared.module'; import { CreateApplicationModule } from '../create-application/create-application.module'; import { DeployApplicationOptionsStepComponent, @@ -27,7 +27,7 @@ import { GithubProjectExistsDirective } from './github-project-exists.directive' SharedModule, CommonModule, CreateApplicationModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], declarations: [ DeployApplicationComponent, 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 ef257b7919..de2ca64431 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 @@ -6,10 +6,10 @@ 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 { GitSCMService } from '../../../../../core/src/shared/data-services/scm/scm.service'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; 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 8130df31a0..ac555207ef 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 @@ -7,7 +7,7 @@ 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 '../../../../../core/src/shared/data-services/scm/scm.service'; +import { GitSCMService, GitSCMType } from '../../../shared/data-services/scm/scm.service'; interface GithubProjectExistsResponse { githubProjectDoesNotExist: boolean; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.spec.ts index a67f90a8f8..f25b7fa87f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.spec.ts @@ -7,18 +7,16 @@ import { RouterTestingModule } from '@angular/router/testing'; import { GetApplication } from '../../../../../cloud-foundry/src/actions/application.actions'; import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; import { CoreModule } from '../../../../../core/src/core/core.module'; -import { - ApplicationStateService, -} from '../../../../../core/src/shared/components/application-state/application-state.service'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; +import { generateTestEntityServiceProvider } from '../../../../../core/test-framework/entity-service.helper'; import { ApplicationServiceMock, generateTestApplicationServiceProvider, -} from '../../../../../core/test-framework/application-service-helper'; -import { generateTestEntityServiceProvider } from '../../../../../core/test-framework/entity-service.helper'; +} from '../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { applicationEntityType } from '../../../cf-entity-types'; +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'; import { EditApplicationComponent } from './edit-application.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.ts index c65207fecb..e6d94e7058 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/edit-application/edit-application.component.ts @@ -9,11 +9,11 @@ import { filter, map, take } from 'rxjs/operators'; import { AppMetadataTypes } from '../../../../../cloud-foundry/src/actions/app-metadata.actions'; import { SetCFDetails, SetNewAppName } from '../../../../../cloud-foundry/src/actions/create-applications-page.actions'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; +import { StepOnNextFunction } from '../../../../../core/src/shared/components/stepper/step/step.component'; import { AppNameUniqueChecking, AppNameUniqueDirective, -} from '../../../../../core/src/shared/app-name-unique.directive/app-name-unique.directive'; -import { StepOnNextFunction } from '../../../../../core/src/shared/components/stepper/step/step.component'; +} from '../../../shared/directives/app-name-unique.directive/app-name-unique.directive'; import { ApplicationService } from '../application.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-route-stepper/add-route-stepper.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-route-stepper/add-route-stepper.component.spec.ts index 67e7b3fc5e..f06e6bbbd2 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-route-stepper/add-route-stepper.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-route-stepper/add-route-stepper.component.spec.ts @@ -6,7 +6,7 @@ import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SteppersModule } from '../../../../../../core/src/shared/components/stepper/steppers.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../application.service'; import { AddRoutesComponent } from '../add-routes/add-routes.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.spec.ts index ce92e35982..3d91ab69af 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.spec.ts @@ -4,7 +4,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../application.service'; import { MapRoutesComponent } from '../map-routes/map-routes.component'; 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 8c5e71e8bf..0b3902f107 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 @@ -2,30 +2,21 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'rxjs'; -import { filter, map, mergeMap, pairwise, switchMap, take, tap } from 'rxjs/operators'; +import { filter, map, mergeMap, pairwise, switchMap, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - domainEntityType, - routeEntityType, - spaceEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { domainEntityType, spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationKey } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { Route, RouteMode } from '../../../../../../cloud-foundry/src/store/types/route.types'; -import { IDomain, ISpace } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { pathGet } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction, StepOnNextResult, } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { ActionState, RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { IDomain } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationService } from '../../application.service'; const hostPattern = '^([\\w\\-\\.]*)$'; @@ -62,7 +53,6 @@ export class AddRoutesComponent implements OnInit, OnDestroy { constructor( private applicationService: ApplicationService, private store: Store, - private entityServiceFactory: EntityServiceFactory, ) { this.appGuid = applicationService.appGuid; this.cfGuid = applicationService.cfGuid; @@ -111,19 +101,12 @@ export class AddRoutesComponent implements OnInit, OnDestroy { switchMap(() => this.appService.waitForAppEntity$ .pipe( switchMap(app => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + this.spaceGuid = app.entity.entity.space_guid; + return cfEntityCatalog.space.store.getEntityService( app.entity.entity.space_guid, app.entity.entity.cfGuid, { includeRelations: [createEntityRelationKey(spaceEntityType, domainEntityType)] } - ); - this.spaceGuid = app.entity.entity.space_guid; - const spaceService = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ); - return spaceService.waitForEntity$; + ).waitForEntity$; }), filter(({ entity }) => !!entity.entity.domains), tap(({ entity }) => { @@ -221,39 +204,34 @@ export class AddRoutesComponent implements OnInit, OnDestroy { path = '/' + path; } - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('create'); - const createRouteAction = actionBuilder(newRouteGuid, this.cfGuid, new Route(domainGuid, this.spaceGuid, host, path, port)); - - this.store.dispatch(createRouteAction); - return this.store.select(selectCfRequestInfo(routeEntityType, newRouteGuid)) - .pipe( - filter(route => !route.creating && !route.fetching), - mergeMap(route => { - if (route.error) { - return observableOf({ success: false, message: `Failed to create route: ${route.message}` }); - } else { - return this.mapRoute(route.response.result[0]); - } - }) - ); + return cfEntityCatalog.route.api.create( + newRouteGuid, + this.cfGuid, + new Route(domainGuid, this.spaceGuid, host, path, port) + ).pipe( + pairwise(), + filter(([oldR, newR]) => oldR.creating && !newR.creating), + map(([, newR]) => newR), + mergeMap(route => { + if (route.error) { + return observableOf({ success: false, message: `Failed to create route: ${route.message}` }); + } else { + return this.mapRoute(route.response.result[0]); + } + }) + ); } private mapRoute(routeGuid: string): Observable { - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('assignRoute'); - const assignRouteAction = actionBuilder(this.cfGuid, routeGuid, this.appGuid); - this.store.dispatch(assignRouteAction); - return this.store.select(selectCfRequestInfo(applicationEntityType, this.appGuid)).pipe( + return cfEntityCatalog.application.api.assignRoute(this.cfGuid, routeGuid, this.appGuid).pipe( pairwise(), - filter(([oldApp, newApp]) => { - return pathGet('updating.Assigning-Route.busy', oldApp) && !pathGet('updating.Assigning-Route.busy', newApp); - }), - map(([oldApp, newApp]) => newApp), - map((requestState: RequestInfoState) => { + filter(([oldR, newR]) => oldR.busy && !newR.busy), + map(([, newR]) => newR), + map((requestState: ActionState) => { if (requestState.error) { return { success: false, message: `Failed to associate route with app: ${requestState.error}` }; } + cfEntityCatalog.route.api.getAllForApplication(this.appGuid, this.cfGuid) this.store.dispatch(new RouterNav({ path: ['/applications', this.cfGuid, this.appGuid, 'routes'] })); return { success: true }; }) @@ -261,29 +239,8 @@ export class AddRoutesComponent implements OnInit, OnDestroy { } private mapRouteSubmit(): Observable { - return this.selectedRoute$.pipe( - tap(route => { - entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType) - .actionOrchestrator - .getEntityActionDispatcher((action) => this.store.dispatch(action)) - .dispatchAction('assignRoute', this.cfGuid, route.metadata.guid, this.appGuid); - }), - switchMap(() => this.appService.app$), - map(requestInfo => requestInfo.entityRequestInfo.updating['Assigning-Route']), - filter(requestInfo => !requestInfo.busy), - take(1), - map(requestInfo => { - if (requestInfo.error) { - return { success: false, message: `Failed to associate route with app: ${requestInfo.message}` }; - } else { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppRoutesAction = actionBuilder(this.appGuid, this.cfGuid); - this.store.dispatch(getAppRoutesAction); - return { success: true, redirect: true }; - } - }) + switchMap(route => this.mapRoute(route.metadata.guid)) ); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/routes/map-routes/map-routes.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/routes/map-routes/map-routes.component.spec.ts index f55c3a3216..00d73580e0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/routes/map-routes/map-routes.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/routes/map-routes/map-routes.component.spec.ts @@ -6,7 +6,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../core/src/core/core.module'; import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../application.service'; import { MapRoutesComponent } from './map-routes.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.spec.ts index 315cea2227..3454569951 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.spec.ts @@ -4,7 +4,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../core/tab-nav.service'; -import { ApplicationServiceMock } from '../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../application.service'; import { SshApplicationComponent } from './ssh-application.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.ts index c48c1f029c..6aa0845227 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/ssh-application/ssh-application.component.ts @@ -1,14 +1,14 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { NEVER, Observable, Subject, Subscription } from 'rxjs'; +import { NEVER, Observable, Subject } from 'rxjs'; import websocketConnect, { normalClosureMessage } from 'rxjs-websockets'; import { catchError, first, map, switchMap, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { IApp } from '../../../../../core/src/core/cf-api.types'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { SshViewerComponent } from '../../../../../core/src/shared/components/ssh-viewer/ssh-viewer.component'; +import { IApp } from '../../../cf-api.types'; import { ApplicationService } from '../application.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts index 8074e720e7..b625a0b8a0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts @@ -5,24 +5,13 @@ import { Observable, Subscription } from 'rxjs'; import { filter, first, map, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - organizationEntityType, - spaceEntityType, - spaceQuotaEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { ISpaceQuotaDefinition } from '../../../../core/src/core/cf-api.types'; import { StepOnNextResult } from '../../../../core/src/shared/components/stepper/step/step.component'; import { getPaginationKey } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../cf-types'; -import { SpaceQuotaDefinitionActionBuilders } from '../../entity-action-builders/space-quota.action-builders'; +import { ISpaceQuotaDefinition } from '../../cf-api.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from './cf-page.types'; export class AddEditSpaceStepBase { @@ -38,26 +27,16 @@ export class AddEditSpaceStepBase { constructor( protected store: Store, protected activatedRoute: ActivatedRoute, - protected paginationMonitorFactory: PaginationMonitorFactory, - protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace + protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; this.orgGuid = activeRouteCfOrgSpace.orgGuid; - const paginationKey = getPaginationKey(organizationEntityType, this.orgGuid); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const getAllSpaceActionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const action = getAllSpaceActionBuilder(this.orgGuid, this.cfGuid, paginationKey) as PaginatedAction; - this.allSpacesInOrg$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - new CFEntityConfig(spaceEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.allSpacesInOrg$ = cfEntityCatalog.space.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + getPaginationKey(organizationEntityType, this.orgGuid), { + flatten: true, + } ).entities$.pipe( filter(spaces => !!spaces), map(spaces => spaces.map(space => space.entity.name)), @@ -66,25 +45,10 @@ export class AddEditSpaceStepBase { ); this.fetchSpacesSubscription = this.allSpacesInOrg$.subscribe(); - const quotaPaginationKey = createEntityRelationPaginationKey(organizationEntityType, this.orgGuid); - - const quotaEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceQuotaEntityType - ); - const actionBuilder = quotaEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const getAllInOrganization = actionBuilder(this.orgGuid, this.cfGuid, quotaPaginationKey); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getAllInOrganization as PaginatedAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(spaceQuotaEntityType), - getAllInOrganization.flattenPagination - ) - }, - getAllInOrganization.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.spaceQuota.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + createEntityRelationPaginationKey(organizationEntityType, this.orgGuid) ).entities$.pipe( filter(o => !!o), first() diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts index 02408e0b7d..c5e99f073c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts @@ -7,22 +7,20 @@ import { filter, map, tap } from 'rxjs/operators'; import { CreateOrganization } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType, quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; -import { IOrganization, IOrgQuotaDefinition } from '../../../../../../core/src/core/cf-api.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; +import { IOrganization, IOrgQuotaDefinition } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { QuotaDefinitionActionBuilder } from '../../../../entity-action-builders/quota-definition.action-builders'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; @@ -48,7 +46,7 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { constructor( private store: Store, - private activatedRoute: ActivatedRoute, + activatedRoute: ActivatedRoute, private paginationMonitorFactory: PaginationMonitorFactory, ) { this.cfGuid = activatedRoute.snapshot.params.endpointId; @@ -78,23 +76,8 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { ); const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - quotaDefinitionEntityType - ); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid, { includeRelations: [] }); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService( + quotaPaginationKey, this.cfGuid, { includeRelations: [] } ).entities$.pipe( filter(o => !!o), tap(quotas => { @@ -104,7 +87,7 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { }); } }) - ); + ) this.orgSubscription = this.orgs$.subscribe(); } diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts similarity index 75% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts index 9e9c9c488a..80bc70ebd1 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.spec.ts @@ -1,12 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - LongRunningCfOperationsService, -} from '../../../../../cloud-foundry/src/shared/data-services/long-running-cf-op.service'; -import { - generateCfBaseTestModules, -} from '../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; -import { TabNavService } from '../../../../tab-nav.service'; +import { TabNavService } from '../../../../../core/tab-nav.service'; +import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { LongRunningCfOperationsService } from '../../../shared/data-services/long-running-cf-op.service'; import { QuotaDefinitionFormComponent } from '../quota-definition-form/quota-definition-form.component'; import { AddQuotaComponent } from './add-quota.component'; import { CreateQuotaStepComponent } from './create-quota-step/create-quota-step.component'; diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.ts similarity index 60% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.ts index cce80f142c..092e9eee7c 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/add-quota.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/add-quota.component.ts @@ -1,9 +1,7 @@ import { Component } from '@angular/core'; -import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; - -// TODO: Move CF code to CF Module #3769. There's a few quota related components to move +import { ActiveRouteCfOrgSpace } from '../cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; @Component({ selector: 'app-add-quota', diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts similarity index 91% rename from src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts index 865d586e5b..8491748aef 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; +import { CFBaseTestModules } from '../../../../../test-framework/cf-test-helper'; import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; import { CreateQuotaStepComponent } from './create-quota-step.component'; -import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('CreateQuotaStepComponent', () => { let component: CreateQuotaStepComponent; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts new file mode 100644 index 0000000000..772a75ba57 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts @@ -0,0 +1,52 @@ +import { Component, ViewChild } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Subscription } from 'rxjs'; +import { filter, map, pairwise } from 'rxjs/operators'; + +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; + + +@Component({ + selector: 'app-create-quota-step', + templateUrl: './create-quota-step.component.html', + styleUrls: ['./create-quota-step.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] +}) +export class CreateQuotaStepComponent { + + quotasSubscription: Subscription; + cfGuid: string; + quotaForm: FormGroup; + + @ViewChild('form', { static: true }) + form: QuotaDefinitionFormComponent; + + constructor( + activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, + ) { + this.cfGuid = activeRouteCfOrgSpace.cfGuid; + } + + validate = () => !!this.form && this.form.valid(); + + submit: StepOnNextFunction = () => { + const formValues = this.form.formGroup.value; + return cfEntityCatalog.quotaDefinition.api.create(formValues.name, this.cfGuid, formValues).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.creating && !newV.creating), + map(([, newV]) => newV), + map(requestInfo => ({ + success: !requestInfo.error, + redirect: !requestInfo.error, + message: requestInfo.error ? `Failed to create quota: ${requestInfo.message}` : '' + })) + ); + } +} diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts similarity index 86% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts index b06d57ce24..a9f62d776d 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.spec.ts @@ -1,10 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { TabNavService } from '../../../../tab-nav.service'; +import { TabNavService } from '../../../../../core/tab-nav.service'; +import { CFBaseTestModules } from '../../../../test-framework/cf-test-helper'; import { SpaceQuotaDefinitionFormComponent } from '../space-quota-definition-form/space-quota-definition-form.component'; import { AddSpaceQuotaComponent } from './add-space-quota.component'; import { CreateSpaceQuotaStepComponent } from './create-space-quota-step/create-space-quota-step.component'; -import { CFBaseTestModules } from '../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('AddSpaceQuotaComponent', () => { let component: AddSpaceQuotaComponent; diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts similarity index 72% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts index fc8d6f13df..77707617d5 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/add-space-quota.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; -import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; + +import { ActiveRouteCfOrgSpace } from '../cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; @Component({ selector: 'app-add-space-quota', diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts similarity index 91% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts index 4534e426fb..4607826a80 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; +import { CFBaseTestModules } from '../../../../../test-framework/cf-test-helper'; import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; import { CreateSpaceQuotaStepComponent } from './create-space-quota-step.component'; -import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('CreateSpaceQuotaStepComponent', () => { let component: CreateSpaceQuotaStepComponent; diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts similarity index 53% rename from src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts index b1371907dc..af6f0b51e1 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts @@ -1,27 +1,25 @@ import { Component, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, pairwise } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - SpaceQuotaDefinitionActionBuilders, -} from '../../../../../../cloud-foundry/src/entity-action-builders/space-quota.action-builders'; -import { AppState } from '../../../../../../store/src/app-state'; +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; +import { IQuotaDefinition } from '../../../../cf-api.types'; import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; -import { spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ selector: 'app-create-space-quota-step', templateUrl: './create-space-quota-step.component.html', - styleUrls: ['./create-space-quota-step.component.scss'] + styleUrls: ['./create-space-quota-step.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] }) export class CreateSpaceQuotaStepComponent { @@ -34,10 +32,10 @@ export class CreateSpaceQuotaStepComponent { form: SpaceQuotaDefinitionFormComponent; constructor( - private store: Store, + activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private activatedRoute: ActivatedRoute, ) { - this.cfGuid = this.activatedRoute.snapshot.params.endpointId; + this.cfGuid = activeRouteCfOrgSpace.cfGuid; this.orgGuid = this.activatedRoute.snapshot.params.orgId; } @@ -46,14 +44,10 @@ export class CreateSpaceQuotaStepComponent { submit: StepOnNextFunction = () => { const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceQuotaEntityType); - entityConfig.actionDispatchManager.dispatchCreate(formValues.name, this.cfGuid, { + return cfEntityCatalog.spaceQuota.api.create(formValues.name, this.cfGuid, { orgGuid: this.orgGuid, createQuota: formValues - }); - - return entityConfig.getEntityMonitor(this.store, formValues.name).entityRequest$.pipe( + }).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts index 46a60f0fad..8d2f3e6d96 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts @@ -3,17 +3,12 @@ import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { Subscription } from 'rxjs'; -import { filter } from 'rxjs/operators'; +import { filter, map, pairwise } from 'rxjs/operators'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { SpaceActionBuilders } from '../../../../entity-action-builders/space.action-builders'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AddEditSpaceStepBase } from '../../add-edit-space-step-base'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; @@ -45,10 +40,9 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On constructor( store: Store, activatedRoute: ActivatedRoute, - paginationMonitorFactory: PaginationMonitorFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { - super(store, activatedRoute, paginationMonitorFactory, activeRouteCfOrgSpace); + super(store, activatedRoute, activeRouteCfOrgSpace); } ngOnInit() { @@ -79,21 +73,17 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On submit: StepOnNextFunction = () => { const id = `${this.orgGuid}-${this.spaceName.value}`; - const spaceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceEntityType - ); - spaceEntity.actionDispatchManager.dispatchCreate(id, this.cfGuid, { + return cfEntityCatalog.space.api.create(id, this.cfGuid, { createSpace: { name: this.spaceName.value, organization_guid: this.orgGuid, space_quota_definition_guid: this.quotaDefinition.value }, orgGuid: this.orgGuid - }); - - return this.store.select(selectCfRequestInfo(spaceEntityType, id)).pipe( - filter(o => !!o && !o.fetching && !o.creating), + }).pipe( + pairwise(), + filter(([oldS, newS]) => oldS.creating && !newS.creating), + map(([, newS]) => newS), this.map('Failed to create space: ') ); } diff --git a/src/frontend/packages/core/src/features/cloud-foundry/cf-cell.helpers.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf-cell.helpers.ts similarity index 83% rename from src/frontend/packages/core/src/features/cloud-foundry/cf-cell.helpers.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf-cell.helpers.ts index 04de176b8e..c0673a5c49 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/cf-cell.helpers.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf-cell.helpers.ts @@ -2,18 +2,16 @@ import { Store } from '@ngrx/store'; import { Observable, of } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap } from 'rxjs/operators'; -import { FetchCFCellMetricsPaginatedAction } from '../../../../cloud-foundry/src/actions/cf-metrics.actions'; -import { CFEntityConfig } from '../../../../cloud-foundry/src/cf-types'; -import { - CellMetrics, -} from '../../../../cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service'; +import { endpointHasMetricsByAvailable } from '../../../../core/src/features/endpoints/endpoint-helpers'; +import { MetricQueryType } from '../../../../core/src/shared/services/metrics-range-selector.types'; import { MetricQueryConfig } from '../../../../store/src/actions/metrics.actions'; import { AppState } from '../../../../store/src/app-state'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { IMetrics } from '../../../../store/src/types/base-metric.types'; -import { MetricQueryType } from '../../shared/services/metrics-range-selector.types'; -import { endpointHasMetricsByAvailable } from '../endpoints/endpoint-helpers'; +import { FetchCFCellMetricsPaginatedAction } from '../../actions/cf-metrics.actions'; +import { CFEntityConfig } from '../../cf-types'; +import { CellMetrics } from './tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service'; export class CfCellHelper { diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf.helpers.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf.helpers.ts index 96d7f27b3f..f94cb8b54a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf.helpers.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cf.helpers.ts @@ -19,8 +19,6 @@ import { UserRoleInSpace, } from '../../../../cloud-foundry/src/store/types/user.types'; import { UserRoleLabels } from '../../../../cloud-foundry/src/store/types/users-roles.types'; -import { IServiceInstance, IUserProvidedServiceInstance } from '../../../../core/src/core/cf-api-svc.types'; -import { ISpace } from '../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions, PermissionConfig, @@ -28,13 +26,12 @@ import { } from '../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../core/src/core/current-user-permissions.service'; import { getIdFromRoute, pathGet } from '../../../../core/src/core/utils.service'; -import { CFFeatureFlagTypes } from '../../../../core/src/shared/components/cf-auth/cf-auth.types'; import { extractActualListEntity, } from '../../../../core/src/shared/components/list/data-sources-controllers/local-filtering-sorting'; import { SetClientFilter } from '../../../../store/src/actions/pagination.actions'; import { RouterNav } from '../../../../store/src/actions/router.actions'; -import { MultiActionListEntity } from '../../../../store/src/monitors/pagination-monitor'; +import { AppState } from '../../../../store/src/app-state'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { endpointEntitiesSelector } from '../../../../store/src/selectors/endpoint.selectors'; @@ -42,6 +39,8 @@ import { selectPaginationState } from '../../../../store/src/selectors/paginatio import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; import { PaginatedAction, PaginationEntityState } from '../../../../store/src/types/pagination.types'; +import { IServiceInstance, IUserProvidedServiceInstance } from '../../cf-api-svc.types'; +import { CFFeatureFlagTypes, ISpace } from '../../cf-api.types'; import { cfEntityFactory } from '../../cf-entity-factory'; import { CFEntityConfig } from '../../cf-types'; import { ActiveRouteCfCell, ActiveRouteCfOrgSpace } from './cf-page.types'; @@ -214,13 +213,6 @@ function hasRole(user: CfUser, guid: string, roleType: string) { return false; } -export const getRowMetadata = (entity: APIResource | MultiActionListEntity) => { - if (entity instanceof MultiActionListEntity) { - return entity.entity.metadata ? entity.entity.metadata.guid : null; - } - return entity.metadata ? entity.metadata.guid : null; -}; - export function getActiveRouteCfOrgSpace(activatedRoute: ActivatedRoute) { return ({ cfGuid: getIdFromRoute(activatedRoute, 'endpointId'), @@ -297,7 +289,7 @@ export function canUpdateOrgRoles( return perms.can(CurrentUserPermissions.ORGANIZATION_CHANGE_ROLES, cfGuid, orgGuid); } -export function waitForCFPermissions(store: Store, cfGuid: string): Observable { +export function waitForCFPermissions(store: Store, cfGuid: string): Observable { return store.select(getCurrentUserCFEndpointRolesState(cfGuid)).pipe( filter(cf => cf && cf.state.initialised), first(), @@ -306,14 +298,14 @@ export function waitForCFPermissions(store: Store, cfGuid: string): ); } -export function selectConnectedCfs(store: Store): Observable { +export function selectConnectedCfs(store: Store): Observable { return store.select(endpointEntitiesSelector).pipe( map(endpoints => Object.values(endpoints)), map(endpoints => endpoints.filter(endpoint => endpoint.cnsi_type === 'cf' && endpoint.connectionStatus === 'connected')), ); } -export function haveMultiConnectedCfs(store: Store): Observable { +export function haveMultiConnectedCfs(store: Store): Observable { return selectConnectedCfs(store).pipe( map(connectedCfs => connectedCfs.length > 1) ); @@ -329,7 +321,7 @@ export function createFetchTotalResultsPagKey(standardActionKey: string): string export function fetchTotalResults( action: PaginatedAction, - store: Store, + store: Store, paginationMonitorFactory: PaginationMonitorFactory ): Observable { const newAction = { @@ -425,7 +417,7 @@ export function isUserProvidedServiceInstance(obj: any): IUserProvidedServiceIns export function someFeatureFlags( ff: CFFeatureFlagTypes[], cfGuid: string, - store: Store, + store: Store, userPerms: CurrentUserPermissionsService, ): Observable { return waitForCFPermissions(store, cfGuid).pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.spec.ts index 537b4881ec..ec3e649441 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.spec.ts @@ -7,6 +7,11 @@ import { } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CliCommandComponent } from '../../../shared/components/cli-info/cli-command/cli-command.component'; import { CliInfoComponent } from '../../../shared/components/cli-info/cli-info.component'; +import { ApplicationStateService } from '../../../shared/services/application-state.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; +import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { CliInfoCloudFoundryComponent } from './cli-info-cloud-foundry.component'; describe('CliInfoCloudFoundryComponent', () => { @@ -19,6 +24,9 @@ describe('CliInfoCloudFoundryComponent', () => { imports: generateCfBaseTestModules(), providers: [ generateTestCfEndpointServiceProvider(), + ActiveRouteCfOrgSpace, + ApplicationStateService, + CloudFoundryUserProvidedServicesService, TabNavService ] }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.ts index 7f168ba8c3..ee4e82af47 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cli-info-cloud-foundry/cli-info-cloud-foundry.component.ts @@ -5,7 +5,6 @@ import { first, map } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { CFAppCLIInfoContext } from '../../../../../cloud-foundry/src/shared/components/cli-info/cli-info.component'; -import { IOrganization, ISpace } from '../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsChecker } from '../../../../../core/src/core/current-user-permissions.checker'; import { CurrentUserPermissions } from '../../../../../core/src/core/current-user-permissions.config'; import { getFullEndpointApiUrl } from '../../../../../core/src/features/endpoints/endpoint-helpers'; @@ -14,6 +13,10 @@ import { RouterNav } from '../../../../../store/src/actions/router.actions'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; import { getPreviousRoutingState } from '../../../../../store/src/types/routing.type'; +import { IOrganization, ISpace } from '../../../cf-api.types'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { CloudFoundryEndpointService } from '../services/cloud-foundry-endpoint.service'; @@ -29,7 +32,8 @@ import { CloudFoundrySpaceService } from '../services/cloud-foundry-space.servic getActiveRouteCfOrgSpaceProvider, CloudFoundryEndpointService, CloudFoundryOrganizationService, - CloudFoundrySpaceService + CloudFoundrySpaceService, + CloudFoundryUserProvidedServicesService ] }) export class CliInfoCloudFoundryComponent implements OnInit { @@ -99,7 +103,7 @@ export class CliInfoCloudFoundryComponent implements OnInit { map(route => { return { url: route && route.state ? route.state.url : defaultBackLink, - queryParams: route && route.state.queryParams ? route.state.queryParams : {} + queryParams: route && route.state && route.state.queryParams ? route.state.queryParams : {} }; }) ); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry-base/cloud-foundry-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry-base/cloud-foundry-base.component.ts index dea9e6296c..514c908ea0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry-base/cloud-foundry-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry-base/cloud-foundry-base.component.ts @@ -3,7 +3,7 @@ import { Component } from '@angular/core'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { CloudFoundryEndpointService } from '../services/cloud-foundry-endpoint.service'; -import { UserInviteService } from '../user-invites/user-invite.service'; +import { UserInviteConfigureService, UserInviteService } from '../user-invites/user-invite.service'; @Component({ selector: 'app-cloud-foundry-base', @@ -12,6 +12,7 @@ import { UserInviteService } from '../user-invites/user-invite.service'; providers: [ getActiveRouteCfOrgSpaceProvider, UserInviteService, + UserInviteConfigureService, CfUserService, CloudFoundryEndpointService, ] diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.module.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.module.ts index b1cdef38b8..3e6a816d3e 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.module.ts @@ -3,40 +3,8 @@ import { RouterModule } from '@angular/router'; import { NgxChartsModule } from '@swimlane/ngx-charts'; import { CoreModule } from '../../../../core/src/core/core.module'; -import { AddQuotaComponent } from '../../../../core/src/features/cloud-foundry/add-quota/add-quota.component'; -import { - CreateQuotaStepComponent, -} from '../../../../core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component'; -import { - AddSpaceQuotaComponent, -} from '../../../../core/src/features/cloud-foundry/add-space-quota/add-space-quota.component'; -import { - CreateSpaceQuotaStepComponent, -} from '../../../../core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component'; -import { - EditQuotaStepComponent, -} from '../../../../core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component'; -import { EditQuotaComponent } from '../../../../core/src/features/cloud-foundry/edit-quota/edit-quota.component'; -import { - EditSpaceQuotaStepComponent, -} from '../../../../core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component'; -import { - EditSpaceQuotaComponent, -} from '../../../../core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component'; -import { - QuotaDefinitionFormComponent, -} from '../../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; -import { - SpaceQuotaDefinitionFormComponent, -} from '../../../../core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component'; -import { - CloudFoundryOrganizationSpaceQuotasComponent, -} from '../../../../core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component'; -import { - CloudFoundryQuotasComponent, -} from '../../../../core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component'; import { SharedModule } from '../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { CFEndpointsListConfigService, } from '../../shared/components/list/list-types/cf-endpoints/cf-endpoints-list-config.service'; @@ -44,6 +12,10 @@ import { AddOrganizationComponent } from './add-organization/add-organization.co import { CreateOrganizationStepComponent, } from './add-organization/create-organization-step/create-organization-step.component'; +import { AddQuotaComponent } from './add-quota/add-quota.component'; +import { CreateQuotaStepComponent } from './add-quota/create-quota-step/create-quota-step.component'; +import { AddSpaceQuotaComponent } from './add-space-quota/add-space-quota.component'; +import { CreateSpaceQuotaStepComponent } from './add-space-quota/create-space-quota-step/create-space-quota-step.component'; import { AddSpaceComponent } from './add-space/add-space.component'; import { CreateSpaceStepComponent } from './add-space/create-space-step/create-space-step.component'; import { ActiveRouteCfCell, ActiveRouteCfOrgSpace } from './cf-page.types'; @@ -54,11 +26,17 @@ import { CloudFoundryRoutingModule } from './cloud-foundry.routing'; import { CloudFoundryComponent } from './cloud-foundry/cloud-foundry.component'; import { EditOrganizationStepComponent } from './edit-organization/edit-organization-step/edit-organization-step.component'; import { EditOrganizationComponent } from './edit-organization/edit-organization.component'; +import { EditQuotaStepComponent } from './edit-quota/edit-quota-step/edit-quota-step.component'; +import { EditQuotaComponent } from './edit-quota/edit-quota.component'; +import { EditSpaceQuotaStepComponent } from './edit-space-quota/edit-space-quota-step/edit-space-quota-step.component'; +import { EditSpaceQuotaComponent } from './edit-space-quota/edit-space-quota.component'; import { EditSpaceStepComponent } from './edit-space/edit-space-step/edit-space-step.component'; import { EditSpaceComponent } from './edit-space/edit-space.component'; +import { QuotaDefinitionFormComponent } from './quota-definition-form/quota-definition-form.component'; import { QuotaDefinitionComponent } from './quota-definition/quota-definition.component'; import { CloudFoundryEndpointService } from './services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from './services/cloud-foundry-organization.service'; +import { SpaceQuotaDefinitionFormComponent } from './space-quota-definition-form/space-quota-definition-form.component'; import { SpaceQuotaDefinitionComponent } from './space-quota-definition/space-quota-definition.component'; import { CfAdminAddUserWarningComponent } from './tabs/cf-admin-add-user-warning/cf-admin-add-user-warning.component'; import { CloudFoundryBuildPacksComponent } from './tabs/cloud-foundry-build-packs/cloud-foundry-build-packs.component'; @@ -79,6 +57,9 @@ import { CloudFoundryCellsComponent } from './tabs/cloud-foundry-cells/cloud-fou import { CloudFoundryEventsComponent } from './tabs/cloud-foundry-events/cloud-foundry-events.component'; import { CloudFoundryFeatureFlagsComponent } from './tabs/cloud-foundry-feature-flags/cloud-foundry-feature-flags.component'; import { CloudFoundryFirehoseComponent } from './tabs/cloud-foundry-firehose/cloud-foundry-firehose.component'; +import { + CloudFoundryOrganizationSpaceQuotasComponent, +} from './tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component'; import { CloudFoundryInviteUserLinkComponent, } from './tabs/cloud-foundry-organizations/cloud-foundry-invite-user-link/cloud-foundry-invite-user-link.component'; @@ -124,6 +105,7 @@ import { import { CloudFoundryOrganizationsComponent, } from './tabs/cloud-foundry-organizations/cloud-foundry-organizations.component'; +import { CloudFoundryQuotasComponent } from './tabs/cloud-foundry-quotas/cloud-foundry-quotas.component'; import { CloudFoundryRoutesComponent } from './tabs/cloud-foundry-routes/cloud-foundry-routes.component'; import { CloudFoundrySecurityGroupsComponent, @@ -134,7 +116,7 @@ import { CloudFoundryUsersComponent } from './tabs/cloud-foundry-users/cloud-fou import { UserInviteConfigurationDialogComponent, } from './user-invites/configuration-dialog/user-invite-configuration-dialog.component'; -import { UserInviteService } from './user-invites/user-invite.service'; +import { UserInviteConfigureService, UserInviteService } from './user-invites/user-invite.service'; import { InviteUsersCreateComponent } from './users/invite-users/invite-users-create/invite-users-create.component'; import { InviteUsersComponent } from './users/invite-users/invite-users.component'; import { UsersRolesConfirmComponent } from './users/manage-users/manage-users-confirm/manage-users-confirm.component'; @@ -158,7 +140,7 @@ import { RemoveUserComponent } from './users/remove-user/remove-user.component'; CloudFoundryRoutingModule, RouterModule, NgxChartsModule, - CloudFoundryComponentsModule + CloudFoundrySharedModule ], declarations: [ CloudFoundryBaseComponent, @@ -245,6 +227,7 @@ import { RemoveUserComponent } from './users/remove-user/remove-user.component'; // CfRolesService, CloudFoundryCellService, UserInviteService, + UserInviteConfigureService ], entryComponents: [ UserInviteConfigurationDialogComponent diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.routing.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.routing.ts index 6b9076d688..cdfcacbe8b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.routing.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/cloud-foundry.routing.ts @@ -6,27 +6,17 @@ import { StratosActionType } from '../../../../core/src/core/extension/extension import { PageNotFoundComponentComponent, } from '../../../../core/src/core/page-not-found-component/page-not-found-component.component'; -import { AddQuotaComponent } from '../../../../core/src/features/cloud-foundry/add-quota/add-quota.component'; -import { - AddSpaceQuotaComponent, -} from '../../../../core/src/features/cloud-foundry/add-space-quota/add-space-quota.component'; -import { EditQuotaComponent } from '../../../../core/src/features/cloud-foundry/edit-quota/edit-quota.component'; -import { - EditSpaceQuotaComponent, -} from '../../../../core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component'; -import { - CloudFoundryOrganizationSpaceQuotasComponent, -} from '../../../../core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component'; -import { - CloudFoundryQuotasComponent, -} from '../../../../core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component'; import { AddOrganizationComponent } from './add-organization/add-organization.component'; +import { AddQuotaComponent } from './add-quota/add-quota.component'; +import { AddSpaceQuotaComponent } from './add-space-quota/add-space-quota.component'; import { AddSpaceComponent } from './add-space/add-space.component'; import { CliInfoCloudFoundryComponent } from './cli-info-cloud-foundry/cli-info-cloud-foundry.component'; import { CloudFoundryBaseComponent } from './cloud-foundry-base/cloud-foundry-base.component'; import { CloudFoundryTabsBaseComponent } from './cloud-foundry-tabs-base/cloud-foundry-tabs-base.component'; import { CloudFoundryComponent } from './cloud-foundry/cloud-foundry.component'; import { EditOrganizationComponent } from './edit-organization/edit-organization.component'; +import { EditQuotaComponent } from './edit-quota/edit-quota.component'; +import { EditSpaceQuotaComponent } from './edit-space-quota/edit-space-quota.component'; import { EditSpaceComponent } from './edit-space/edit-space.component'; import { QuotaDefinitionComponent } from './quota-definition/quota-definition.component'; import { SpaceQuotaDefinitionComponent } from './space-quota-definition/space-quota-definition.component'; @@ -47,6 +37,9 @@ import { CloudFoundryCellsComponent } from './tabs/cloud-foundry-cells/cloud-fou import { CloudFoundryEventsComponent } from './tabs/cloud-foundry-events/cloud-foundry-events.component'; import { CloudFoundryFeatureFlagsComponent } from './tabs/cloud-foundry-feature-flags/cloud-foundry-feature-flags.component'; import { CloudFoundryFirehoseComponent } from './tabs/cloud-foundry-firehose/cloud-foundry-firehose.component'; +import { + CloudFoundryOrganizationSpaceQuotasComponent, +} from './tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component'; import { CloudFoundryOrganizationBaseComponent, } from './tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component'; @@ -89,6 +82,7 @@ import { import { CloudFoundryOrganizationsComponent, } from './tabs/cloud-foundry-organizations/cloud-foundry-organizations.component'; +import { CloudFoundryQuotasComponent } from './tabs/cloud-foundry-quotas/cloud-foundry-quotas.component'; import { CloudFoundryRoutesComponent } from './tabs/cloud-foundry-routes/cloud-foundry-routes.component'; import { CloudFoundrySecurityGroupsComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.spec.ts index fe3c60c481..12cbcf54ef 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.spec.ts @@ -4,6 +4,9 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../shared/services/cloud-foundry-user-provided-services.service'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { EditOrganizationStepComponent } from './edit-organization-step.component'; @@ -15,7 +18,7 @@ describe('EditOrganizationStepComponent', () => { TestBed.configureTestingModule({ declarations: [EditOrganizationStepComponent], imports: generateCfBaseTestModules(), - providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider()] + providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), CloudFoundryUserProvidedServicesService] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts index 0624440521..cc3e90927d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts @@ -2,27 +2,26 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; -import { filter, map, take, tap } from 'rxjs/operators'; +import { filter, map, pairwise, take, tap } from 'rxjs/operators'; -import { UpdateOrganization } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType, quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { IOrganization, IOrgQuotaDefinition } from '../../../../../../core/src/core/cf-api.types'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; +import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { selectRequestInfo } from '../../../../../../store/src/selectors/api.selectors'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IOrganization, IOrgQuotaDefinition } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { QuotaDefinitionActionBuilder } from '../../../../entity-action-builders/quota-definition.action-builders'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../shared/services/cloud-foundry-user-provided-services.service'; import { getActiveRouteCfOrgSpaceProvider } from '../../cf.helpers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../services/cloud-foundry-organization.service'; @@ -38,7 +37,8 @@ const enum OrgStatus { styleUrls: ['./edit-organization-step.component.scss'], providers: [ getActiveRouteCfOrgSpaceProvider, - CloudFoundryOrganizationService + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService ] }) export class EditOrganizationStepComponent implements OnInit, OnDestroy { @@ -115,23 +115,8 @@ export class EditOrganizationStepComponent implements OnInit, OnDestroy { this.fetchOrgsSub = this.allOrgsInEndpoint$.subscribe(); const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - quotaDefinitionEntityType - ); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService( + quotaPaginationKey, this.cfGuid, { includeRelations: [] } ).entities$.pipe( filter(o => !!o), ); @@ -147,17 +132,14 @@ export class EditOrganizationStepComponent implements OnInit, OnDestroy { } submit: StepOnNextFunction = () => { - const action = new UpdateOrganization(this.orgGuid, this.cfGuid, { + return cfEntityCatalog.org.api.update(this.orgGuid, this.cfGuid, { name: this.editOrgName.value.orgName, quota_definition_guid: this.editOrgName.value.quotaDefinition, status: this.status ? OrgStatus.ACTIVE : OrgStatus.SUSPENDED - }); - this.store.dispatch(action); - - // Update action - return this.store.select(selectRequestInfo(action, this.orgGuid)).pipe( - filter(o => !!o && !o.updating[UpdateOrganization.UpdateExistingOrg].busy), - map(o => o.updating[UpdateOrganization.UpdateExistingOrg]), + }).pipe( + pairwise(), + filter(([oldS, newS]) => oldS.busy && !newS.busy), + map(([, newS]) => newS), map(o => ({ success: !o.error, redirect: !o.error, diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization.component.spec.ts index ecead39a28..e176d3137a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization.component.spec.ts @@ -5,6 +5,9 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { EditOrganizationStepComponent } from './edit-organization-step/edit-organization-step.component'; import { EditOrganizationComponent } from './edit-organization.component'; @@ -17,8 +20,12 @@ describe('EditOrganizationComponent', () => { TestBed.configureTestingModule({ declarations: [EditOrganizationComponent, EditOrganizationStepComponent], imports: generateCfBaseTestModules(), - providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), TabNavService] - + providers: [ + ActiveRouteCfOrgSpace, + generateTestCfEndpointServiceProvider(), + TabNavService, + CloudFoundryUserProvidedServicesService, + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts similarity index 74% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts index e7122f0e0d..3267ef2916 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.spec.ts @@ -1,9 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; import { EditQuotaStepComponent } from './edit-quota-step.component'; -import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('EditQuotaStepComponent', () => { let component: EditQuotaStepComponent; @@ -13,7 +14,20 @@ describe('EditQuotaStepComponent', () => { TestBed.configureTestingModule({ declarations: [EditQuotaStepComponent, QuotaDefinitionFormComponent, QuotaDefinitionFormComponent], imports: [...CFBaseTestModules], - providers: [PaginationMonitorFactory] + providers: [ + PaginationMonitorFactory, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + quotaId: 'quotaId', + cfId: 'cfGuid' + }, + queryParams: {} + }, + } + } + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts new file mode 100644 index 0000000000..822c25a51a --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts @@ -0,0 +1,77 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Observable, Subscription } from 'rxjs'; +import { filter, first, map, pairwise, tap } from 'rxjs/operators'; + +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; +import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { AppState } from '../../../../../../store/src/app-state'; +import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IOrgQuotaDefinition } from '../../../../cf-api.types'; +import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; + + +@Component({ + selector: 'app-edit-quota-step', + templateUrl: './edit-quota-step.component.html', + styleUrls: ['./edit-quota-step.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] +}) +export class EditQuotaStepComponent implements OnDestroy { + + cfGuid: string; + quotaGuid: string; + quotaDefinition$: Observable>; + quotaSubscription: Subscription; + quota: IOrgQuotaDefinition; + + @ViewChild('form') + form: QuotaDefinitionFormComponent; + + constructor( + private store: Store, + private activatedRoute: ActivatedRoute, + activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, + ) { + this.cfGuid = activeRouteCfOrgSpace.cfGuid; + this.quotaGuid = this.activatedRoute.snapshot.params.quotaId; + + this.fetchQuotaDefinition(); + } + + fetchQuotaDefinition() { + this.quotaDefinition$ = cfEntityCatalog.quotaDefinition.store.getEntityService(this.quotaGuid, this.cfGuid, {}).waitForEntity$.pipe( + first(), + map(data => data.entity), + tap((resource) => this.quota = resource.entity) + ); + + this.quotaSubscription = this.quotaDefinition$.subscribe(); + } + + validate = () => this.form && this.form.valid(); + + submit: StepOnNextFunction = () => + cfEntityCatalog.quotaDefinition.api.update(this.quotaGuid, this.cfGuid, this.form.formGroup.value).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + map(requestInfo => ({ + success: !requestInfo.error, + redirect: !requestInfo.error, + message: requestInfo.error ? `Failed to update quota: ${requestInfo.message}` : '' + })) + ); + + + ngOnDestroy() { + safeUnsubscribe(this.quotaSubscription); + } +} diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts similarity index 64% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts index 29f7a610d8..71fd777494 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.spec.ts @@ -1,10 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; -import { TabNavService } from '../../../../tab-nav.service'; +import { TabNavService } from '../../../../../core/tab-nav.service'; +import { CFBaseTestModules } from '../../../../test-framework/cf-test-helper'; import { QuotaDefinitionFormComponent } from '../quota-definition-form/quota-definition-form.component'; import { EditQuotaStepComponent } from './edit-quota-step/edit-quota-step.component'; import { EditQuotaComponent } from './edit-quota.component'; -import { CFBaseTestModules } from '../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('EditQuotaComponent', () => { let component: EditQuotaComponent; @@ -14,7 +15,20 @@ describe('EditQuotaComponent', () => { TestBed.configureTestingModule({ declarations: [EditQuotaComponent, EditQuotaStepComponent, QuotaDefinitionFormComponent], imports: [...CFBaseTestModules], - providers: [TabNavService] + providers: [ + TabNavService, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + quotaId: 'quotaId', + cfId: 'cfGuid' + }, + queryParams: {} + }, + } + } + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.ts similarity index 75% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.ts index 5ce1ba244b..671e9c5170 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-quota/edit-quota.component.ts @@ -2,9 +2,9 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { QUOTA_FROM_LIST } from '../../../shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service'; -import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { QUOTA_ORG_GUID } from '../../../../../cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component'; +import { ActiveRouteCfOrgSpace } from '../cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; +import { QUOTA_ORG_GUID } from '../quota-definition/quota-definition.component'; @Component({ selector: 'app-edit-quota', diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts similarity index 75% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts index 74d77d5265..052372456f 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.spec.ts @@ -1,9 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; import { EditSpaceQuotaStepComponent } from './edit-space-quota-step.component'; -import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('EditSpaceQuotaStepComponent', () => { let component: EditSpaceQuotaStepComponent; @@ -15,7 +16,20 @@ describe('EditSpaceQuotaStepComponent', () => { imports: [ ...CFBaseTestModules ], - providers: [PaginationMonitorFactory] + providers: [ + PaginationMonitorFactory, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + quotaId: 'quotaId', + endpointId: 'endpointId' + }, + queryParams: {} + }, + } + } + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts new file mode 100644 index 0000000000..30746139e2 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts @@ -0,0 +1,78 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Observable, Subscription } from 'rxjs'; +import { filter, map, pairwise, tap } from 'rxjs/operators'; + +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; +import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; +import { AppState } from '../../../../../../store/src/app-state'; +import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { APIResource } from '../../../../../../store/src/types/api.types'; +import { ISpaceQuotaDefinition } from '../../../../cf-api.types'; +import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; + + +@Component({ + selector: 'app-edit-space-quota-step', + templateUrl: './edit-space-quota-step.component.html', + styleUrls: ['./edit-space-quota-step.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] +}) +export class EditSpaceQuotaStepComponent implements OnDestroy { + + spaceQuotaSubscription: Subscription; + cfGuid: string; + spaceQuotaGuid: string; + allQuotas: string[]; + spaceQuotaDefinition$: Observable>; + quota: ISpaceQuotaDefinition; + + @ViewChild('form') + form: SpaceQuotaDefinitionFormComponent; + + constructor( + private store: Store, + private activatedRoute: ActivatedRoute, + private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace + ) { + + this.cfGuid = this.activeRouteCfOrgSpace.cfGuid; + this.spaceQuotaGuid = this.activatedRoute.snapshot.params.quotaId; + + this.fetchQuotaDefinition(); + } + + fetchQuotaDefinition() { + this.spaceQuotaDefinition$ = cfEntityCatalog.spaceQuota.store.getEntityService(this.spaceQuotaGuid, this.cfGuid, {}).waitForEntity$.pipe( + map(data => data.entity), + tap((resource) => this.quota = resource.entity) + ); + + this.spaceQuotaSubscription = this.spaceQuotaDefinition$.subscribe(); + } + + validate = () => !!this.form && this.form.valid(); + + submit: StepOnNextFunction = () => + cfEntityCatalog.spaceQuota.api.update(this.spaceQuotaGuid, this.cfGuid, this.form.formGroup.value).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + map(requestInfo => ({ + success: !requestInfo.error, + redirect: !requestInfo.error, + message: requestInfo.error ? `Failed to update space quota: ${requestInfo.message}` : '' + })) + ); + + + ngOnDestroy() { + safeUnsubscribe(this.spaceQuotaSubscription); + } +} diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts similarity index 66% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts index 5e43bc144c..a17eee1dee 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.spec.ts @@ -1,10 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; -import { TabNavService } from '../../../../tab-nav.service'; +import { TabNavService } from '../../../../../core/tab-nav.service'; +import { CFBaseTestModules } from '../../../../test-framework/cf-test-helper'; import { SpaceQuotaDefinitionFormComponent } from '../space-quota-definition-form/space-quota-definition-form.component'; import { EditSpaceQuotaStepComponent } from './edit-space-quota-step/edit-space-quota-step.component'; import { EditSpaceQuotaComponent } from './edit-space-quota.component'; -import { CFBaseTestModules } from '../../../../../cloud-foundry/test-framework/cf-test-helper'; describe('EditSpaceQuotaComponent', () => { let component: EditSpaceQuotaComponent; @@ -14,7 +15,20 @@ describe('EditSpaceQuotaComponent', () => { TestBed.configureTestingModule({ declarations: [EditSpaceQuotaComponent, EditSpaceQuotaStepComponent, SpaceQuotaDefinitionFormComponent], imports: [...CFBaseTestModules], - providers: [TabNavService] + providers: [ + TabNavService, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + quotaId: 'quotaId', + endpointId: 'endpointId' + }, + queryParams: {} + }, + } + } + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts similarity index 77% rename from src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts index c2d832587a..15e07f989c 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space-quota/edit-space-quota.component.ts @@ -2,11 +2,9 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { QUOTA_FROM_LIST } from '../../../shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service'; -import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { - QUOTA_SPACE_GUID -} from '../../../../../cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component'; +import { ActiveRouteCfOrgSpace } from '../cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; +import { QUOTA_SPACE_GUID } from '../space-quota-definition/space-quota-definition.component'; @Component({ selector: 'app-edit-space-quota', diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.spec.ts index 4dd6fbacb2..96634d0f66 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.spec.ts @@ -1,10 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../core/test-framework/cloud-foundry-space.service.mock'; import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySpaceServiceMock } from '../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../services/cloud-foundry-space.service'; import { EditSpaceStepComponent } from './edit-space-step.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts index eb91cc358f..ab2f460630 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts @@ -3,22 +3,12 @@ import { FormControl, FormGroup } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; -import { filter, map, switchMap, take, tap } from 'rxjs/operators'; - -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { - AssociateSpaceQuota, - DisassociateSpaceQuota, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { UpdateSpace } from '../../../../../../cloud-foundry/src/actions/space.actions'; +import { filter, map, pairwise, switchMap, take, tap } from 'rxjs/operators'; + import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { spaceEntityType, spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { selectRequestInfo } from '../../../../../../store/src/selectors/api.selectors'; -import { SpaceQuotaDefinitionActionBuilders } from '../../../../entity-action-builders/space-quota.action-builders'; +import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AddEditSpaceStepBase } from '../../add-edit-space-step-base'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { CloudFoundrySpaceService } from '../../services/cloud-foundry-space.service'; @@ -43,11 +33,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe constructor( store: Store, activatedRoute: ActivatedRoute, - paginationMonitorFactory: PaginationMonitorFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private cfSpaceService: CloudFoundrySpaceService + private cfSpaceService: CloudFoundrySpaceService, ) { - super(store, activatedRoute, paginationMonitorFactory, activeRouteCfOrgSpace); + super(store, activatedRoute, activeRouteCfOrgSpace); this.spaceGuid = activatedRoute.snapshot.params.spaceId; this.editSpaceForm = new FormGroup({ spaceName: new FormControl('', this.spaceNameTakenValidator()), @@ -86,7 +75,7 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe submit: StepOnNextFunction = () => { const spaceQuotaGuid = this.editSpaceForm.value.quotaDefinition; - return this.updateSpace$().pipe( + return this.updateSpace().pipe( switchMap((spaceStateAction) => { let message = ''; @@ -105,54 +94,31 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe return of({ success: true, redirect: true }); } - return this.updateSpaceQuota$(); + return this.updateSpaceQuota(); }), ); } - updateSpace$() { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('update'); - const updateSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid, { + updateSpace() { + return cfEntityCatalog.space.api.update(this.spaceGuid, this.cfGuid, { name: this.editSpaceForm.value.spaceName, allow_ssh: this.editSpaceForm.value.toggleSsh as boolean, - }); - this.store.dispatch(updateSpaceAction); - - return this.store.select(selectRequestInfo(updateSpaceAction, this.spaceGuid)).pipe( - filter(o => !!o && !o.updating[UpdateSpace.UpdateExistingSpace].busy), - map((state) => state.updating[UpdateSpace.UpdateExistingSpace]) + }).pipe( + pairwise(), + filter(([oldS, newS]) => oldS.busy && !newS.busy), + map(([, newS]) => newS), ); } - updateSpaceQuota$() { + updateSpaceQuota() { const spaceQuotaGuid = this.editSpaceForm.value.quotaDefinition; - let spaceQuotaQueryGuid; - let action: AssociateSpaceQuota | DisassociateSpaceQuota; - - const spaceQuotaEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceQuotaEntityType - ); - if (spaceQuotaGuid) { - spaceQuotaQueryGuid = spaceQuotaGuid; - const actionBuilder = spaceQuotaEntity.actionOrchestrator.getActionBuilder('associateWithSpace'); - action = actionBuilder(this.spaceGuid, this.cfGuid, spaceQuotaQueryGuid) as AssociateSpaceQuota; - } else { - spaceQuotaQueryGuid = this.originalSpaceQuotaGuid; - const actionBuilder = spaceQuotaEntity.actionOrchestrator.getActionBuilder('disassociateFromSpace'); - action = actionBuilder(this.spaceGuid, this.cfGuid, spaceQuotaQueryGuid) as DisassociateSpaceQuota; - } - this.store.dispatch(action); - - - return this.store.select(selectRequestInfo(action, spaceQuotaQueryGuid)).pipe( - filter(o => { - return !!o && - o.updating[AssociateSpaceQuota.UpdateExistingSpaceQuota] && - !o.updating[AssociateSpaceQuota.UpdateExistingSpaceQuota].busy; - }), - map((state) => state.updating[AssociateSpaceQuota.UpdateExistingSpaceQuota]), + const mon = spaceQuotaGuid ? + cfEntityCatalog.spaceQuota.api.associateWithSpace(this.spaceGuid, this.cfGuid, spaceQuotaGuid) : + cfEntityCatalog.spaceQuota.api.disassociateFromSpace(this.spaceGuid, this.cfGuid, this.originalSpaceQuotaGuid) + return mon.pipe( + pairwise(), + filter(([oldS, newS]) => oldS.busy && !newS.busy), + map(([, newS]) => newS), map(stateAction => ({ success: !stateAction.error, redirect: !stateAction.error, diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.spec.ts index a1c01fa14c..7c09107d9c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.spec.ts @@ -5,6 +5,9 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { CloudFoundryOrganizationService } from '../services/cloud-foundry-organization.service'; import { EditSpaceStepComponent } from './edit-space-step/edit-space-step.component'; @@ -18,7 +21,13 @@ describe('EditSpaceComponent', () => { TestBed.configureTestingModule({ declarations: [EditSpaceComponent, EditSpaceStepComponent], imports: generateCfBaseTestModules(), - providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), TabNavService, CloudFoundryOrganizationService] + providers: [ + ActiveRouteCfOrgSpace, + generateTestCfEndpointServiceProvider(), + TabNavService, + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.ts index 76fb5def9f..e1c96b852b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space.component.ts @@ -1,8 +1,14 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { CfUserService } from '../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; +import { CloudFoundryEndpointService } from '../services/cloud-foundry-endpoint.service'; +import { CloudFoundryOrganizationService } from '../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../services/cloud-foundry-space.service'; @Component({ @@ -11,15 +17,19 @@ import { CloudFoundrySpaceService } from '../services/cloud-foundry-space.servic styleUrls: ['./edit-space.component.scss'], providers: [ getActiveRouteCfOrgSpaceProvider, - CloudFoundrySpaceService + CfUserService, + CloudFoundryEndpointService, + CloudFoundrySpaceService, + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService ] }) -export class EditSpaceComponent implements OnInit { +export class EditSpaceComponent { spaceName$: Observable; spaceUrl: string; - constructor(private cfSpaceService: CloudFoundrySpaceService) { + constructor(cfSpaceService: CloudFoundrySpaceService) { this.spaceUrl = '/cloud-foundry/' + `${cfSpaceService.cfGuid}/organizations/` + @@ -29,8 +39,4 @@ export class EditSpaceComponent implements OnInit { map(s => s.entity.entity.name) ); } - - ngOnInit() { - } - } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts index 89fdc4cf30..0753fa182a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts @@ -3,21 +3,13 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of, Subscription } from 'rxjs'; import { first, map } from 'rxjs/operators'; -import { - IOrganization, - IOrgQuotaDefinition, - ISpace, - ISpaceQuotaDefinition, -} from '../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; 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 { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { organizationEntityType, spaceEntityType } from '../../../cf-entity-types'; +import { IOrganization, IOrgQuotaDefinition, ISpace, ISpaceQuotaDefinition } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; export class QuotaDefinitionBaseComponent { @@ -33,7 +25,6 @@ export class QuotaDefinitionBaseComponent { orgSubscriber: Subscription; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, protected activatedRoute: ActivatedRoute, @@ -49,13 +40,7 @@ export class QuotaDefinitionBaseComponent { setupOrgObservable() { if (this.orgGuid) { - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(this.orgGuid, this.cfGuid); - this.org$ = this.entityServiceFactory.create>( - this.orgGuid, - getOrgAction - ).waitForEntity$.pipe( + this.org$ = cfEntityCatalog.org.store.getEntityService(this.orgGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), ); } @@ -63,13 +48,7 @@ export class QuotaDefinitionBaseComponent { setupSpaceObservable() { if (this.spaceGuid) { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid); - this.space$ = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ).waitForEntity$.pipe( + this.space$ = cfEntityCatalog.space.store.getEntityService(this.spaceGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), ); } diff --git a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts similarity index 53% rename from src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts index 0f73bbfb4b..f271b4ec36 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts @@ -1,26 +1,15 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; +import { Subscription } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; -import { quotaDefinitionEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cloud-foundry/src/cf-types'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; +import { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; +import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { safeUnsubscribe } from '../../../../../core/src/core/utils.service'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../core/cf-api.types'; -import { safeUnsubscribe } from '../../../core/utils.service'; +import { IQuotaDefinition } from '../../../cf-api.types'; export interface QuotaFormValues { name: string; @@ -39,23 +28,23 @@ export interface QuotaFormValues { @Component({ selector: 'app-quota-definition-form', templateUrl: './quota-definition-form.component.html', - styleUrls: ['./quota-definition-form.component.scss'] + styleUrls: ['./quota-definition-form.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] }) export class QuotaDefinitionFormComponent implements OnInit, OnDestroy { quotasSubscription: Subscription; cfGuid: string; allQuotas: string[]; - quotaDefinitions$: Observable[]>; formGroup: FormGroup; @Input() quota: IQuotaDefinition; constructor( - private store: Store, - private activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, + activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { - this.cfGuid = this.activatedRoute.snapshot.params.endpointId; + this.cfGuid = activeRouteCfOrgSpace.cfGuid; } ngOnInit() { @@ -83,28 +72,14 @@ export class QuotaDefinitionFormComponent implements OnInit, OnDestroy { fetchQuotasDefinitions() { const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid, {}); - this.quotaDefinitions$ = getPaginationObservables( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - getQuotaDefinitionsAction.flattenPagination - ) - }, - getQuotaDefinitionsAction.flattenPagination - ).entities$.pipe( - filter(o => !!o), - map(o => o.map(org => org.entity.name)), - tap((o) => this.allQuotas = o) - ); - - this.quotasSubscription = this.quotaDefinitions$.subscribe(); + const quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService(quotaPaginationKey, this.cfGuid, {}) + .entities$.pipe( + filter(o => !!o), + map(o => o.map(org => org.entity.name)), + tap((o: string[]) => this.allQuotas = o) + ); + + this.quotasSubscription = quotaDefinitions$.subscribe(); } nameTakenValidator = (): ValidatorFn => { diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts index de3bb0449e..4764ba5876 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts @@ -4,15 +4,14 @@ import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { GetQuotaDefinition } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { IOrganization, IOrgQuotaDefinition, ISpace } from '../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; import { APIResource } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { IOrganization, IOrgQuotaDefinition, ISpace } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { QuotaDefinitionBaseComponent } from '../quota-definition-base/quota-definition-base.component'; @@ -44,13 +43,12 @@ export class QuotaDefinitionComponent extends QuotaDefinitionBaseComponent { public isCf = false; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, activatedRoute: ActivatedRoute, currentUserPermissionsService: CurrentUserPermissionsService ) { - super(entityServiceFactory, store, activeRouteCfOrgSpace, activatedRoute); + super(store, activeRouteCfOrgSpace, activatedRoute); this.setupQuotaDefinitionObservable(); const { cfGuid, orgGuid } = activeRouteCfOrgSpace; this.canEditQuota$ = currentUserPermissionsService.can(CurrentUserPermissions.QUOTA_EDIT, cfGuid); @@ -62,10 +60,7 @@ export class QuotaDefinitionComponent extends QuotaDefinitionBaseComponent { const quotaGuid$ = this.quotaGuid ? of(this.quotaGuid) : this.org$.pipe(map(org => org.entity.quota_definition_guid)); const entityInfo$ = quotaGuid$.pipe( first(), - switchMap(quotaGuid => this.entityServiceFactory.create>( - quotaGuid, - new GetQuotaDefinition(quotaGuid, this.cfGuid), - ).entityObs$) + switchMap(quotaGuid => cfEntityCatalog.quotaDefinition.store.getEntityService(quotaGuid, this.cfGuid, {}).entityObs$) ); this.quotaDefinition$ = entityInfo$.pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts index a5b1ba50c8..7f489dbfb6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts @@ -4,10 +4,8 @@ import { Observable } from 'rxjs'; import { filter, first, map, publishReplay, refCount } from 'rxjs/operators'; import { GetAllApplications } from '../../../../../cloud-foundry/src/actions/application.actions'; -import { DeleteOrganization, GetAllOrganizations } from '../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { - cfInfoEntityType, domainEntityType, organizationEntityType, privateDomainsEntityType, @@ -19,28 +17,21 @@ import { createEntityRelationPaginationKey, } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { CfApplicationState } from '../../../../../cloud-foundry/src/store/types/application.types'; -import { IApp, ICfV2Info, IOrganization, ISpace } from '../../../../../core/src/core/cf-api.types'; -import { EndpointsService } from '../../../../../core/src/core/endpoints.service'; import { GetAllEndpoints } from '../../../../../store/src/actions/endpoint.actions'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { EntityService } from '../../../../../store/src/entity-service'; import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { - getPaginationObservables, - PaginationObservables, -} from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { PaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; import { EndpointModel, EndpointUser } from '../../../../../store/src/types/endpoint.types'; import { PaginatedAction } from '../../../../../store/src/types/pagination.types'; import { GetAllRoutes } from '../../../actions/route.actions'; import { GetSpaceRoutes } from '../../../actions/space.actions'; +import { IApp, ICfV2Info, IOrganization, ISpace } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { CfInfoDefinitionActionBuilders } from '../../../entity-action-builders/cf-info.action-builders'; -import { OrganizationActionBuilders } from '../../../entity-action-builders/organization.action-builders'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { QParam, QParamJoiners } from '../../../shared/q-param'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; @@ -76,18 +67,11 @@ export class CloudFoundryEndpointService { currentUser$: Observable; cfGuid: string; - getAllOrgsAction: GetAllOrganizations; - - private getAllAppsAction: GetAllApplications; - static createGetAllOrganizations(cfGuid: string) { const paginationKey = cfGuid ? createEntityRelationPaginationKey(endpointSchemaKey, cfGuid) : createEntityRelationPaginationKey(endpointSchemaKey); - const organizationEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(cfGuid, paginationKey, + const getAllOrganizationsAction = cfEntityCatalog.org.actions.getMultiple(cfGuid, paginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), @@ -102,9 +86,7 @@ export class CloudFoundryEndpointService { const paginationKey = cfGuid ? createEntityRelationPaginationKey(endpointSchemaKey, cfGuid) : createEntityRelationPaginationKey(endpointSchemaKey); - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(cfGuid, paginationKey, + const getAllOrganizationsAction = cfEntityCatalog.org.actions.getMultiple(cfGuid, paginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), @@ -159,25 +141,15 @@ export class CloudFoundryEndpointService { private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private pmf: PaginationMonitorFactory, - private endpointService: EndpointsService, - private paginationMonitorFactory: PaginationMonitorFactory ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; - this.getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(this.cfGuid) as GetAllOrganizations; - this.getAllAppsAction = new GetAllApplications(createEntityRelationPaginationKey('cf', this.cfGuid), this.cfGuid); this.cfEndpointEntityService = this.entityServiceFactory.create( this.cfGuid, new GetAllEndpoints() ); - const cfInfoEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfInfoEntityType); - const actionBuilder = cfInfoEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(this.cfGuid); - this.cfInfoEntityService = this.entityServiceFactory.create>( - this.cfGuid, - action, - ); + this.cfInfoEntityService = cfEntityCatalog.cfInfo.store.getEntityService(this.cfGuid) this.constructCoreObservables(); this.constructSecondaryObservable(); } @@ -185,36 +157,26 @@ export class CloudFoundryEndpointService { private constructCoreObservables() { this.endpoint$ = this.cfEndpointEntityService.waitForEntity$; + const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(this.cfGuid); this.orgs$ = getPaginationObservables>({ store: this.store, - action: this.getAllOrgsAction, + action: getAllOrgsAction, paginationMonitor: this.pmf.create( - this.getAllOrgsAction.paginationKey, + getAllOrgsAction.paginationKey, cfEntityFactory(organizationEntityType), - this.getAllOrgsAction.flattenPagination + getAllOrgsAction.flattenPagination ) - }, this.getAllOrgsAction.flattenPagination).entities$; + }, getAllOrgsAction.flattenPagination).entities$; this.info$ = this.cfInfoEntityService.waitForEntity$; this.usersCount$ = this.cfUserService.fetchTotalUsers(this.cfGuid); this.constructAppObs(); - - this.fetchDomains(); } constructAppObs() { - const appPaginationMonitor = this.pmf.create( - this.getAllAppsAction.paginationKey, - this.getAllAppsAction, - this.getAllAppsAction.flattenPagination - ); - this.appsPagObs = getPaginationObservables>({ - store: this.store, - action: this.getAllAppsAction, - paginationMonitor: appPaginationMonitor - }, this.getAllAppsAction.flattenPagination); + this.appsPagObs = cfEntityCatalog.application.store.getPaginationService(this.cfGuid); } private constructSecondaryObservable() { @@ -260,30 +222,16 @@ export class CloudFoundryEndpointService { .reduce((a, t) => a + t, 0) : 0; } - public fetchDomains = () => { - const domainEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, domainEntityType); - const actionBuilder = domainEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(this.cfGuid, null); - this.paginationSubscription = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.pmf.create( - action.paginationKey, - cfEntityFactory(domainEntityType), - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$.pipe(first()).subscribe(); + public fetchDomains() { + cfEntityCatalog.domain.api.getMultiple(this.cfGuid, null, {}); } public deleteOrg(orgGuid: string, endpointGuid: string) { - this.store.dispatch(new DeleteOrganization(orgGuid, endpointGuid)); + cfEntityCatalog.org.api.remove(orgGuid, endpointGuid); } fetchApps() { - this.store.dispatch(this.getAllAppsAction); + cfEntityCatalog.application.api.getMultiple(this.cfGuid); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts index 10da08098e..0e89121107 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts @@ -1,13 +1,13 @@ import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { CFEntityConfig } from '../../../cf-types'; -import { IApp, IOrganization, ISpace } from '../../../../../core/src/core/cf-api.types'; import { truthyIncludingZero } from '../../../../../core/src/core/utils.service'; import { determineCardStatus } from '../../../../../core/src/shared/components/cards/card-status/card-status.component'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IApp, IOrganization, ISpace } from '../../../cf-api.types'; +import { CFEntityConfig } from '../../../cf-types'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization-quota.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization-quota.ts index 74d85d945a..932894115e 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization-quota.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization-quota.ts @@ -1,11 +1,11 @@ import { Observable } from 'rxjs'; import { organizationEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { IApp, IOrganization } from '../../../../../core/src/core/cf-api.types'; -import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../../../core/src/core/cf.helpers'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IApp, IOrganization } from '../../../cf-api.types'; +import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../cf.helpers'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; import { OrgSpaceQuotaHelper } from './cloud-foundry-org-space-quota'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts index a1c41cc54b..a85683a86f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts @@ -13,6 +13,8 @@ import { spaceEntityType, } from '../../../../../cloud-foundry/src/cf-entity-types'; import { OrgUserRoleNames } from '../../../../../cloud-foundry/src/store/types/user.types'; +import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; +import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; import { IApp, IOrganization, @@ -20,20 +22,14 @@ import { IPrivateDomain, ISpace, ISpaceQuotaDefinition, -} from '../../../../../core/src/core/cf-api.types'; -import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../../../core/src/core/cf.helpers'; -import { - CloudFoundryUserProvidedServicesService, -} from '../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { OrganizationActionBuilders } from '../../../entity-action-builders/organization.action-builders'; +} from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../cf.helpers'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getOrgRolesString } from '../cf.helpers'; @@ -89,7 +85,6 @@ export class CloudFoundryOrganizationService { constructor( public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private store: Store, - private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private paginationMonitorFactory: PaginationMonitorFactory, private cfEndpointService: CloudFoundryEndpointService, @@ -102,10 +97,7 @@ export class CloudFoundryOrganizationService { } public deleteSpace(spaceGuid: string, orgGuid: string, endpointGuid: string) { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteSpaceAction = actionBuilder(spaceGuid, endpointGuid, { orgGuid }); - this.store.dispatch(deleteSpaceAction); + cfEntityCatalog.space.api.remove(spaceGuid, endpointGuid, { orgGuid }) } public fetchApps() { @@ -132,15 +124,7 @@ export class CloudFoundryOrganizationService { createEntityRelationKey(organizationEntityType, OrgUserRoleNames.AUDITOR), ); } - const orgEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(this.orgGuid, this.cfGuid, { includeRelations: relations }); - const orgEntityService = this.entityServiceFactory.create>( - this.orgGuid, - getOrgAction - ); - return orgEntityService.waitForEntity$; + return cfEntityCatalog.org.store.getEntityService(this.orgGuid, this.cfGuid, { includeRelations: relations }).waitForEntity$; }), publishReplay(1), refCount() diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space-quota.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space-quota.ts index 871c66f3ce..1be45b3e30 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space-quota.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space-quota.ts @@ -1,11 +1,11 @@ import { Observable } from 'rxjs'; import { spaceEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { IApp, ISpace } from '../../../../../core/src/core/cf-api.types'; -import { getStartedAppInstanceCount } from '../../../../../core/src/core/cf.helpers'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IApp, ISpace } from '../../../cf-api.types'; +import { getStartedAppInstanceCount } from '../../../cf.helpers'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; import { OrgSpaceQuotaHelper } from './cloud-foundry-org-space-quota'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts index 8b34067470..794c014a7b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts @@ -13,23 +13,21 @@ import { spaceQuotaEntityType, } from '../../../../../cloud-foundry/src/cf-entity-types'; import { SpaceUserRoleNames } from '../../../../../cloud-foundry/src/store/types/user.types'; -import { IApp, IOrgQuotaDefinition, IRoute, ISpace, ISpaceQuotaDefinition } from '../../../../../core/src/core/cf-api.types'; -import { getStartedAppInstanceCount } from '../../../../../core/src/core/cf.helpers'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { - CloudFoundryUserProvidedServicesService, -} from '../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; +import { IApp, IOrgQuotaDefinition, IRoute, ISpace, ISpaceQuotaDefinition } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { getStartedAppInstanceCount } from '../../../cf.helpers'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../shared/services/cloud-foundry-user-provided-services.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getSpaceRolesString } from '../cf.helpers'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService, createOrgQuotaDefinition } from './cloud-foundry-organization.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; @Injectable() export class CloudFoundrySpaceService { @@ -63,7 +61,6 @@ export class CloudFoundrySpaceService { constructor( public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private store: Store, - private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private paginationMonitorFactory: PaginationMonitorFactory, private cfEndpointService: CloudFoundryEndpointService, @@ -119,14 +116,8 @@ export class CloudFoundrySpaceService { createEntityRelationKey(spaceEntityType, SpaceUserRoleNames.AUDITOR), ); } - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid, { includeRelations: relations }); - const spaceEntityService = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ); - return spaceEntityService.entityObs$.pipe(filter(o => !!o && !!o.entity)); + return cfEntityCatalog.space.store.getEntityService(this.spaceGuid, this.cfGuid, { includeRelations: relations }) + .entityObs$.pipe(filter(o => !!o && !!o.entity)); }), publishReplay(1), refCount() diff --git a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts similarity index 59% rename from src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts index a5055fbf0a..a6bacfc2c6 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts @@ -1,44 +1,41 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; -import { GetOrganizationSpaceQuotaDefinitions } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; -import { spaceQuotaEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { AppState } from '../../../../../store/src/app-state'; +import { ActiveRouteCfOrgSpace } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { getActiveRouteCfOrgSpaceProvider } from '../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; +import { safeUnsubscribe } from '../../../../../core/src/core/utils.service'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../core/cf-api.types'; -import { safeUnsubscribe } from '../../../core/utils.service'; +import { IQuotaDefinition } from '../../../cf-api.types'; @Component({ selector: 'app-space-quota-definition-form', templateUrl: './space-quota-definition-form.component.html', - styleUrls: ['./space-quota-definition-form.component.scss'] + styleUrls: ['./space-quota-definition-form.component.scss'], + providers: [ + getActiveRouteCfOrgSpaceProvider + ] }) export class SpaceQuotaDefinitionFormComponent implements OnInit, OnDestroy { quotasSubscription: Subscription; cfGuid: string; orgGuid: string; allQuotas: string[]; - spaceQuotaDefinitions$: Observable[]>; + spaceQuotaDefinitions$: Observable; formGroup: FormGroup; @Input() quota: IQuotaDefinition; constructor( - private store: Store, + activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, ) { - this.cfGuid = this.activatedRoute.snapshot.params.endpointId; + this.cfGuid = activeRouteCfOrgSpace.cfGuid; this.orgGuid = this.activatedRoute.snapshot.params.orgId; } @@ -65,24 +62,16 @@ export class SpaceQuotaDefinitionFormComponent implements OnInit, OnDestroy { } fetchQuotasDefinitions() { - const spaceQuotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const action = new GetOrganizationSpaceQuotaDefinitions(spaceQuotaPaginationKey, this.orgGuid, this.cfGuid); - this.spaceQuotaDefinitions$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - spaceQuotaPaginationKey, - cfEntityFactory(spaceQuotaEntityType), - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$.pipe( - filter(o => !!o), - map(o => o.map(org => org.entity.name)), - tap((o) => this.allQuotas = o) - ); + this.spaceQuotaDefinitions$ = cfEntityCatalog.spaceQuota.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid) + ).entities$ + .pipe( + filter(o => !!o), + map(o => o.map(org => org.entity.name)), + tap((o) => this.allQuotas = o) + ); this.quotasSubscription = this.spaceQuotaDefinitions$.subscribe(); } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.spec.ts index 12c5447846..eb4f5d792b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.spec.ts @@ -1,19 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; +import { testSCFEndpoint, testSCFEndpointGuid } from '@stratos/store/testing'; import { endpointEntitySchema } from '../../../../../core/src/base-entity-schemas'; +import { TabNavService } from '../../../../../core/tab-nav.service'; import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; import { EntityCatalogEntityConfig } from '../../../../../store/src/entity-catalog/entity-catalog.types'; -import { TabNavService } from '../../../../../core/tab-nav.service'; -import { testSCFEndpoint, testSCFEndpointGuid } from '@stratos/store/testing'; -import { EntityRelationSpecHelper } from '../../../../../store/src/helpers/entity-relations/entity-relations-spec-helper'; import { NormalizedResponse } from '../../../../../store/src/types/api.types'; import { WrapperRequestActionSuccess } from '../../../../../store/src/types/request.types'; import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { EntityRelationSpecHelper } from '../../../../test-framework/entity-relations-spec-helper'; import { cfEntityFactory } from '../../../cf-entity-factory'; import { organizationEntityType, spaceEntityType } from '../../../cf-entity-types'; import { SpaceQuotaDefinitionComponent } from './space-quota-definition.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts index da9f999835..41e3bb4f58 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts @@ -4,15 +4,14 @@ import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { GetSpaceQuotaDefinition } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { IOrganization, ISpace, ISpaceQuotaDefinition } from '../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; import { APIResource } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { IOrganization, ISpace, ISpaceQuotaDefinition } from '../../../cf-api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { QuotaDefinitionBaseComponent } from '../quota-definition-base/quota-definition-base.component'; @@ -42,13 +41,12 @@ export class SpaceQuotaDefinitionComponent extends QuotaDefinitionBaseComponent public isOrg = false; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, activatedRoute: ActivatedRoute, currentUserPermissionsService: CurrentUserPermissionsService ) { - super(entityServiceFactory, store, activeRouteCfOrgSpace, activatedRoute); + super(store, activeRouteCfOrgSpace, activatedRoute); this.setupQuotaDefinitionObservable(); const { cfGuid, orgGuid, spaceGuid } = activeRouteCfOrgSpace; this.canEditQuota$ = currentUserPermissionsService.can(CurrentUserPermissions.SPACE_QUOTA_EDIT, cfGuid, orgGuid); @@ -60,11 +58,7 @@ export class SpaceQuotaDefinitionComponent extends QuotaDefinitionBaseComponent const quotaGuid$ = this.quotaGuid ? of(this.quotaGuid) : this.space$.pipe(map(space => space.entity.space_quota_definition_guid)); const entityInfo$ = quotaGuid$.pipe( first(), - switchMap(quotaGuid => this.entityServiceFactory.create>( - quotaGuid, - new GetSpaceQuotaDefinition(quotaGuid, this.cfGuid) - ).entityObs$ - ) + switchMap(quotaGuid => cfEntityCatalog.spaceQuota.store.getEntityService(quotaGuid, this.cfGuid, {}).entityObs$) ); this.quotaDefinition$ = entityInfo$.pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.spec.ts index 205c8a732e..ee7518e8c1 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.spec.ts @@ -18,8 +18,14 @@ describe('CloudFoundryCellBaseComponent', () => { imports: generateCfBaseTestModules(), providers: [ CloudFoundryEndpointService, - CloudFoundryCellService, - ActiveRouteCfOrgSpace, + CloudFoundryCellService, { + provide: ActiveRouteCfOrgSpace, + useValue: { + cfGuid: 'cfGuid', + orgGuid: 'orgGuid', + spaceGuid: 'spaceGuid' + } + }, TabNavService, CfUserService ] diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.ts index 042c3dd232..07a77cddd6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell-base/cloud-foundry-cell-base.component.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core'; import { Observable } from 'rxjs'; import { first, map } from 'rxjs/operators'; -import { metricEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; +import { metricEntityType } from '../../../../../../../../core/src/base-entity-schemas'; 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 { cfEntityFactory } from '../../../../../../cf-entity-factory'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service.ts index b4de7ce575..fb6c1e76ec 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service.ts @@ -3,7 +3,6 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; -import { CfCellHelper } from '../../../../../../../core/src/features/cloud-foundry/cf-cell.helpers'; import { MetricsConfig } from '../../../../../../../core/src/shared/components/metrics-chart/metrics-chart.component'; import { MetricsLineChartConfig } from '../../../../../../../core/src/shared/components/metrics-chart/metrics-chart.types'; import { @@ -17,6 +16,7 @@ import { PaginationMonitorFactory } from '../../../../../../../store/src/monitor import { IMetricMatrixResult, IMetrics, IMetricVectorResult } from '../../../../../../../store/src/types/base-metric.types'; import { IMetricCell } from '../../../../../../../store/src/types/metric.types'; import { FetchCFCellMetricsAction } from '../../../../../actions/cf-metrics.actions'; +import { CfCellHelper } from '../../../cf-cell.helpers'; import { ActiveRouteCfCell } from '../../../cf-page.types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.spec.ts index 3d4312faec..a4020756d5 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.spec.ts @@ -27,8 +27,14 @@ describe('CloudFoundryCellsComponent', () => { cellId: 'cellId' }), }, - CloudFoundryEndpointService, - ActiveRouteCfOrgSpace, + CloudFoundryEndpointService, { + provide: ActiveRouteCfOrgSpace, + useValue: { + cfGuid: 'cfGuid', + orgGuid: 'orgGuid', + spaceGuid: 'spaceGuid' + } + }, CfUserService ], }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.ts index cbb3e7b409..39e488c615 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cells.component.ts @@ -2,11 +2,13 @@ import { Component } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { CfCellHelper } from '../../../../../../core/src/features/cloud-foundry/cf-cell.helpers'; import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { AppState } from '../../../../../../store/src/app-state'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { CfCellsListConfigService } from '../../../../shared/components/list/list-types/cf-cells/cf-cells-list-config.service'; +import { + CfCellsListConfigService, +} from '../../../../shared/components/list/list-types/cf-cells/cf-cells-list-config.service'; +import { CfCellHelper } from '../../cf-cell.helpers'; import { getActiveRouteCfCellProvider } from '../../cf.helpers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-events/cloud-foundry-events.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-events/cloud-foundry-events.component.spec.ts index b3c223a491..11639bfe54 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-events/cloud-foundry-events.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-events/cloud-foundry-events.component.spec.ts @@ -23,8 +23,14 @@ describe('CloudFoundryEventsComponent', () => { imports: [...CFBaseTestModules], providers: [ CloudFoundryEndpointService, - ActiveRouteCfOrgSpace, - CfUserService + CfUserService, { + provide: ActiveRouteCfOrgSpace, + useValue: { + cfGuid: 'cfGuid', + orgGuid: 'orgGuid', + spaceGuid: 'spaceGuid' + } + } ] }) .compileComponents(); diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts similarity index 71% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts index ff80a49040..3cda3f2573 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.spec.ts @@ -1,14 +1,12 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CFBaseTestModules } from '../../../../../../../cloud-foundry/test-framework/cf-test-helper'; -import { - generateTestCfEndpointServiceProvider, -} from '../../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; -import { TabNavService } from '../../../../../../tab-nav.service'; +import { TabNavService } from '../../../../../../core/tab-nav.service'; +import { CFBaseTestModules } from '../../../../../test-framework/cf-test-helper'; +import { generateTestCfEndpointServiceProvider } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CfSpaceQuotasListConfigService, -} from '../../../../../shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service'; +} from '../../../../shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service'; import { CloudFoundryOrganizationSpaceQuotasComponent } from './cloud-foundry-organization-space-quotas.component'; describe('CloudFoundryOrganizationSpaceQuotasComponent', () => { diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts similarity index 58% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts index 10a8fbb830..9c814c204c 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organization-space-quotas/cloud-foundry-organization-space-quotas.component.ts @@ -1,16 +1,14 @@ import { Component } from '@angular/core'; import { Observable } from 'rxjs'; -import { CurrentUserPermissions } from '../../../../../core/current-user-permissions.config'; +import { CurrentUserPermissions } from '../../../../../../core/src/core/current-user-permissions.config'; +import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; +import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { CfSpaceQuotasListConfigService, -} from '../../../../../shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service'; -import { ListConfig } from '../../../../../shared/components/list/list.component.types'; -import { CurrentUserPermissionsService } from './../../../../../core/current-user-permissions.service'; -import { - CloudFoundryEndpointService -} from '../../../../../../../cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service'; -import { ActiveRouteCfOrgSpace } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +} from '../../../../shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service'; +import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; +import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; @Component({ selector: 'app-cloud-foundry-organization-space-quotas', diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.spec.ts index d2ac962cbf..2270c81012 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.spec.ts @@ -5,6 +5,9 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundryOrganizationBaseComponent } from './cloud-foundry-organization-base.component'; describe('CloudFoundryOrganizationBaseComponent', () => { @@ -15,7 +18,7 @@ describe('CloudFoundryOrganizationBaseComponent', () => { TestBed.configureTestingModule({ declarations: [CloudFoundryOrganizationBaseComponent], imports: generateCfBaseTestModules(), - providers: [...generateTestCfEndpointServiceProvider(), TabNavService] + providers: [...generateTestCfEndpointServiceProvider(), TabNavService, CloudFoundryUserProvidedServicesService] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.ts index 2d72c29d1e..0c83c22d0f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-base/cloud-foundry-organization-base.component.ts @@ -11,7 +11,7 @@ import { StratosActionType, StratosTabType, } from '../../../../../../../core/src/core/extension/extension-service'; -import { getFavoriteFromCfEntity } from '../../../../../../../core/src/core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../../core/src/core/user-favorite-helpers'; import { environment } from '../../../../../../../core/src/environments/environment.prod'; import { IPageSideNavTab } from '../../../../../../../core/src/features/dashboard/page-side-nav/page-side-nav.component'; import { @@ -21,7 +21,11 @@ import { IHeaderBreadcrumb } from '../../../../../../../core/src/shared/componen import { EntitySchema } from '../../../../../../../store/src/helpers/entity-schema'; import { UserFavorite } from '../../../../../../../store/src/types/user-favorites.types'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; +import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CfUserService } from '../../../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { getActiveRouteCfOrgSpaceProvider } from '../../../cf.helpers'; import { CloudFoundryEndpointService } from '../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry-organization.service'; @@ -34,7 +38,8 @@ import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry getActiveRouteCfOrgSpaceProvider, CfUserService, CloudFoundryEndpointService, - CloudFoundryOrganizationService + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService ] }) export class CloudFoundryOrganizationBaseComponent { @@ -92,7 +97,7 @@ export class CloudFoundryOrganizationBaseComponent { this.schema = cfEntityFactory(organizationEntityType); this.favorite$ = cfOrgService.org$.pipe( first(), - map(org => getFavoriteFromCfEntity(org.entity, organizationEntityType, favoritesConfigMapper)) + map(org => getFavoriteFromEntity(org.entity, organizationEntityType, favoritesConfigMapper, CF_ENDPOINT_TYPE)) ); this.name$ = cfOrgService.org$.pipe( map(org => org.entity.entity.name), diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-events/cloud-foundry-organization-events.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-events/cloud-foundry-organization-events.component.spec.ts index 08ea6f028e..ef58df42ab 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-events/cloud-foundry-organization-events.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-events/cloud-foundry-organization-events.component.spec.ts @@ -12,6 +12,9 @@ import { CfOrganizationEventsConfigService, } from '../../../../../shared/components/list/list-types/cf-events/types/cf-org-events-config.service'; import { CfUserService } from '../../../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundryEndpointService } from '../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry-organization.service'; import { CloudFoundryOrganizationEventsComponent } from './cloud-foundry-organization-events.component'; @@ -34,7 +37,8 @@ describe('CloudFoundryOrganizationEventsComponent', () => { generateActiveRouteCfOrgSpaceMock(), CloudFoundryOrganizationService, CfUserService, - CloudFoundryEndpointService + CloudFoundryEndpointService, + CloudFoundryUserProvidedServicesService ], imports: [...CFBaseTestModules] }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-organization-spaces.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-organization-spaces.component.spec.ts index 54782e02b2..b7ab24ec95 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-organization-spaces.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-organization-spaces.component.spec.ts @@ -7,7 +7,7 @@ import { } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry-organization.service'; import { CloudFoundryOrganizationSpacesComponent } from './cloud-foundry-organization-spaces.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.spec.ts index 38dfaf8ce3..b525621558 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.spec.ts @@ -5,6 +5,9 @@ import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundrySpaceBaseComponent } from './cloud-foundry-space-base.component'; describe('CloudFoundrySpaceBaseComponent', () => { @@ -15,7 +18,7 @@ describe('CloudFoundrySpaceBaseComponent', () => { TestBed.configureTestingModule({ declarations: [CloudFoundrySpaceBaseComponent], imports: generateCfBaseTestModules(), - providers: [generateTestCfEndpointServiceProvider(), TabNavService] + providers: [generateTestCfEndpointServiceProvider(), TabNavService, CloudFoundryUserProvidedServicesService] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts index 91ae786c24..c8c42c5c5a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/cloud-foundry-space-base/cloud-foundry-space-base.component.ts @@ -13,7 +13,7 @@ import { StratosActionType, StratosTabType, } from '../../../../../../../../core/src/core/extension/extension-service'; -import { getFavoriteFromCfEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; import { environment } from '../../../../../../../../core/src/environments/environment.prod'; import { IPageSideNavTab } from '../../../../../../../../core/src/features/dashboard/page-side-nav/page-side-nav.component'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; @@ -24,7 +24,11 @@ import { IHeaderBreadcrumb } from '../../../../../../../../core/src/shared/compo import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; import { UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; +import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { CfUserService } from '../../../../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { getActiveRouteCfOrgSpaceProvider } from '../../../../cf.helpers'; import { CloudFoundryEndpointService } from '../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../../services/cloud-foundry-organization.service'; @@ -38,7 +42,8 @@ import { CloudFoundrySpaceService } from '../../../../services/cloud-foundry-spa getActiveRouteCfOrgSpaceProvider, CfUserService, CloudFoundrySpaceService, - CloudFoundryOrganizationService + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService ] }) export class CloudFoundrySpaceBaseComponent implements OnDestroy { @@ -111,7 +116,7 @@ export class CloudFoundrySpaceBaseComponent implements OnDestroy { favoritesConfigMapper: FavoritesConfigMapper ) { this.favorite$ = cfSpaceService.space$.pipe( - map(space => getFavoriteFromCfEntity(space.entity, spaceEntityType, favoritesConfigMapper)) + map(space => getFavoriteFromEntity(space.entity, spaceEntityType, favoritesConfigMapper, CF_ENDPOINT_TYPE)) ); this.isFetching$ = cfSpaceService.space$.pipe( map(space => space.entityRequestInfo.fetching) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-apps/cloud-foundry-space-apps.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-apps/cloud-foundry-space-apps.component.spec.ts index b7aefc0de0..35860a494a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-apps/cloud-foundry-space-apps.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-apps/cloud-foundry-space-apps.component.spec.ts @@ -1,12 +1,8 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateCfBaseTestModules, -} from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { - CloudFoundrySpaceServiceMock, -} from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { generateCfBaseTestModules } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; import { CloudFoundrySpaceAppsComponent } from './cloud-foundry-space-apps.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-events/cloud-foundry-space-events.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-events/cloud-foundry-space-events.component.spec.ts index 8981199e29..542fe41631 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-events/cloud-foundry-space-events.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-events/cloud-foundry-space-events.component.spec.ts @@ -12,6 +12,9 @@ import { CfSpaceEventsConfigService, } from '../../../../../../../shared/components/list/list-types/cf-events/types/cf-space-events-config.service'; import { CfUserService } from '../../../../../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundryEndpointService } from '../../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../../../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; @@ -36,7 +39,8 @@ describe('CloudFoundrySpaceEventsComponent', () => { CloudFoundrySpaceService, CfUserService, CloudFoundryEndpointService, - CloudFoundryOrganizationService + CloudFoundryOrganizationService, + CloudFoundryUserProvidedServicesService ], imports: [...CFBaseTestModules] }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-routes/cloud-foundry-space-routes.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-routes/cloud-foundry-space-routes.component.spec.ts index 4e2ffdb6e1..1b27ca28c7 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-routes/cloud-foundry-space-routes.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-routes/cloud-foundry-space-routes.component.spec.ts @@ -1,12 +1,8 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateCfBaseTestModules, -} from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { - CloudFoundrySpaceServiceMock, -} from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { generateCfBaseTestModules } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; import { CloudFoundrySpaceRoutesComponent } from './cloud-foundry-space-routes.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-service-instances/cloud-foundry-space-service-instances.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-service-instances/cloud-foundry-space-service-instances.component.spec.ts index 2fde286c22..d1598bc08b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-service-instances/cloud-foundry-space-service-instances.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-service-instances/cloud-foundry-space-service-instances.component.spec.ts @@ -1,16 +1,16 @@ -/* tslint:disable:max-line-length */ import { CommonModule, DatePipe } from '@angular/common'; import { NgModule } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { getCfSpaceServiceMock } from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; import { generateCfBaseTestModules } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { getCfSpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { TableCellAppCfOrgSpaceHeaderComponent, } from '../../../../../../../shared/components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component'; import { ServiceActionHelperService } from '../../../../../../../shared/data-services/service-action-helper.service'; import { CloudFoundrySpaceServiceInstancesComponent } from './cloud-foundry-space-service-instances.component'; +/* tslint:disable:max-line-length */ /* tslint:enable:max-line-length */ @NgModule({ diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts index 42709f07f1..7153674c1d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.spec.ts @@ -1,13 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../../../../core/tab-nav.service'; -import { - CloudFoundrySpaceServiceMock, -} from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; import { generateActiveRouteCfOrgSpaceMock, 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'; @@ -18,6 +16,9 @@ import { CardCfSpaceDetailsComponent, } from '../../../../../../../shared/components/cards/card-cf-space-details/card-cf-space-details.component'; import { CfUserService } from '../../../../../../../shared/data-services/cf-user.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../../../shared/services/cloud-foundry-user-provided-services.service'; import { CloudFoundryEndpointService } from '../../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../../../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; @@ -37,7 +38,8 @@ describe('CloudFoundrySpaceSummaryComponent', () => { { provide: CloudFoundrySpaceService, useClass: CloudFoundrySpaceServiceMock }, CloudFoundryOrganizationService, TabNavService, - CfUserService + CfUserService, + CloudFoundryUserProvidedServicesService ] }) .compileComponents(); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts index 79b8b37122..361689d6b3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts @@ -5,16 +5,16 @@ import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, pairwise, startWith, tap } from 'rxjs/operators'; import { CurrentUserPermissions } from '../../../../../../../../../core/src/core/current-user-permissions.config'; -import { entityCatalog } from '../../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogConfig } from '../../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService, } from '../../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { RouterNav } from '../../../../../../../../../store/src/actions/router.actions'; import { AppState } from '../../../../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectDeletionInfo } from '../../../../../../../../../store/src/selectors/api.selectors'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cf-types'; import { spaceEntityType } from '../../../../../../../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../../../../../../../cf-types'; 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/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-user-service-instances/cloud-foundry-space-user-service-instances.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-user-service-instances/cloud-foundry-space-user-service-instances.component.spec.ts index 1a7dbc15f0..c8ec3532b6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-user-service-instances/cloud-foundry-space-user-service-instances.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-user-service-instances/cloud-foundry-space-user-service-instances.component.spec.ts @@ -1,10 +1,8 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - generateCfBaseTestModules, -} from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { getCfSpaceServiceMock } from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { generateCfBaseTestModules } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { getCfSpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { ServiceActionHelperService } from '../../../../../../../shared/data-services/service-action-helper.service'; import { CloudFoundrySpaceUserServiceInstancesComponent } from './cloud-foundry-space-user-service-instances.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.spec.ts index b18fed16ef..3e7cbb2f19 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.spec.ts @@ -1,16 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../../../../core/tab-nav.service'; -import { - CloudFoundryOrganizationServiceMock, -} from '../../../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; -import { - CloudFoundrySpaceServiceMock, -} from '../../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryOrganizationServiceMock, +} from '../../../../../../../../test-framework/cloud-foundry-organization.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundryOrganizationService } from '../../../../../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; import { CfAdminAddUserWarningComponent } from '../../../../cf-admin-add-user-warning/cf-admin-add-user-warning.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.ts index b514e0762d..be30449c73 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-users/cloud-foundry-space-users.component.ts @@ -6,8 +6,8 @@ import { CurrentUserPermissionsService } from 'frontend/packages/core/src/core/c import { combineLatest, Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; -import { CFFeatureFlagTypes } from '../../../../../../../../../core/src/shared/components/cf-auth/cf-auth.types'; import { ListConfig } from '../../../../../../../../../core/src/shared/components/list/list.component.types'; +import { CFFeatureFlagTypes } from '../../../../../../../cf-api.types'; import { CfSpaceUsersListConfigService, } from '../../../../../../../shared/components/list/list-types/cf-space-users/cf-space-users-list-config.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.spec.ts index ad1c2e77fb..86b4a72c57 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.spec.ts @@ -1,13 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../../core/tab-nav.service'; -import { - CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryOrganizationServiceMock, +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; import { CardCfOrgUserDetailsComponent, } from '../../../../../shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts index d9f8b8ce43..2b3a9cf8f9 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, pairwise, startWith, tap } from 'rxjs/operators'; @@ -8,7 +8,7 @@ import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state' import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { entityCatalog } from '../../../../../../../store/src//entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { selectDeletionInfo } from '../../../../../../../store/src/selectors/api.selectors'; import { organizationEntityType } from '../../../../../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.spec.ts index 441ce3c22e..352fc409a2 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.spec.ts @@ -1,13 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TabNavService } from '../../../../../../../core/tab-nav.service'; -import { - CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider, } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { + CloudFoundryOrganizationServiceMock, +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; import { CloudFoundryOrganizationService } from '../../../services/cloud-foundry-organization.service'; import { CfAdminAddUserWarningComponent } from '../../cf-admin-add-user-warning/cf-admin-add-user-warning.component'; import { diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.ts index 2ad173707e..df764482bc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-users/cloud-foundry-organization-users.component.ts @@ -5,8 +5,8 @@ import { map, switchMap } from 'rxjs/operators'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { CFFeatureFlagTypes } from '../../../../../../../core/src/shared/components/cf-auth/cf-auth.types'; import { ListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; +import { CFFeatureFlagTypes } from '../../../../../cf-api.types'; import { CFAppState } from '../../../../../cf-app-state'; import { CfOrgUsersListConfigService, diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.html similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.html rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.html diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.scss b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.scss similarity index 100% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.scss rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.scss diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts similarity index 89% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts index fdba1e50b3..45606154a2 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.spec.ts @@ -1,16 +1,15 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { TabNavService } from '../../../../../tab-nav.service'; - -import { CloudFoundryQuotasComponent } from './cloud-foundry-quotas.component'; import { - CfOrgsListConfigService + CfOrgsListConfigService, } from '../../../../../../cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-orgs-list-config.service'; +import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; import { - generateTestCfEndpointServiceProvider + generateTestCfEndpointServiceProvider, } from '../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; -import { CFBaseTestModules } from '../../../../../../cloud-foundry/test-framework/cf-test-helper'; +import { TabNavService } from '../../../../../../core/tab-nav.service'; +import { CloudFoundryQuotasComponent } from './cloud-foundry-quotas.component'; describe('CloudFoundryQuotasComponent', () => { let component: CloudFoundryQuotasComponent; diff --git a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts similarity index 66% rename from src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts rename to src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts index b1af025890..566ea33df0 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-quotas/cloud-foundry-quotas.component.ts @@ -1,15 +1,13 @@ import { Component } from '@angular/core'; import { Observable } from 'rxjs'; -import { CurrentUserPermissions } from '../../../../core/current-user-permissions.config'; +import { CurrentUserPermissions } from '../../../../../../core/src/core/current-user-permissions.config'; +import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; +import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; import { CfQuotasListConfigService, } from '../../../../shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service'; -import { ListConfig } from '../../../../shared/components/list/list.component.types'; -import { CurrentUserPermissionsService } from './../../../../core/current-user-permissions.service'; -import { - CloudFoundryEndpointService -} from '../../../../../../cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service'; +import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; @Component({ selector: 'app-cloud-foundry-quotas', diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-routes/cloud-foundry-routes.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-routes/cloud-foundry-routes.component.spec.ts index 6bab9d9e05..16b0b07e54 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-routes/cloud-foundry-routes.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-routes/cloud-foundry-routes.component.spec.ts @@ -16,8 +16,14 @@ describe('CloudFoundryRoutesComponent', () => { declarations: [CloudFoundryRoutesComponent], imports: generateCfBaseTestModules(), providers: [ - CloudFoundryEndpointService, - ActiveRouteCfOrgSpace, + CloudFoundryEndpointService, { + provide: ActiveRouteCfOrgSpace, + useValue: { + cfGuid: 'cfGuid', + orgGuid: 'orgGuid', + spaceGuid: 'spaceGuid' + } + }, DatePipe, CfUserService ] diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/configuration-dialog/user-invite-configuration-dialog.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/configuration-dialog/user-invite-configuration-dialog.component.ts index f5d1ecd678..ba3d856575 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/configuration-dialog/user-invite-configuration-dialog.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/configuration-dialog/user-invite-configuration-dialog.component.ts @@ -6,7 +6,7 @@ import { Observable, Subscription } from 'rxjs'; import { first } from 'rxjs/operators'; import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; -import { UserInviteService } from '../user-invite.service'; +import { UserInviteConfigureService } from '../user-invite.service'; @Component({ @@ -42,7 +42,7 @@ export class UserInviteConfigurationDialogComponent { public fb: FormBuilder, public dialogRef: MatDialogRef, public snackBar: MatSnackBar, - public userInviteService: UserInviteService, + public userInviteConfigureService: UserInviteConfigureService, @Inject(MAT_DIALOG_DATA) public data: { guid: string } @@ -54,7 +54,7 @@ export class UserInviteConfigurationDialogComponent { } submit() { - this.userInviteService.configure( + this.userInviteConfigureService.configure( this.data.guid, this.endpointForm.value.clientID, this.endpointForm.value.clientSecret) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/user-invite.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/user-invite.service.ts index c91612ba71..676e0cb299 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/user-invite.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/user-invites/user-invite.service.ts @@ -54,36 +54,14 @@ interface UserInviteSend { } @Injectable() -export class UserInviteService { - - configured$: Observable; - enabled$: Observable; - canConfigure$: Observable; +export class UserInviteConfigureService { constructor( private store: Store, private http: HttpClient, private snackBar: MatSnackBar, - cfEndpointService: CloudFoundryEndpointService, - private currentUserPermissionsService: CurrentUserPermissionsService, - private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private confirmDialog: ConfirmationDialogService, - ) { - this.configured$ = cfEndpointService.endpoint$.pipe( - filter(v => !!v && !!v.entity), - // Note - metadata could be falsy if smtp server not configured/other metadata properties are missing - map(v => v.entity.metadata && v.entity.metadata.userInviteAllowed === 'true') - ); - - this.canConfigure$ = combineLatest( - waitForCFPermissions(this.store, this.activeRouteCfOrgSpace.cfGuid), - this.store.select('auth') - ).pipe( - map(([cf, auth]) => - cf.global.isAdmin && - auth.sessionData['plugin-config'] && auth.sessionData['plugin-config'].userInvitationsEnabled === 'true') - ); - } + ) { } configure(cfGUID: string, clientID: string, clientSecret: string): Observable { const formData: FormData = new FormData(); @@ -143,9 +121,41 @@ export class UserInviteService { } }); }); + } +} + +@Injectable() +export class UserInviteService { + + configured$: Observable; + enabled$: Observable; + canConfigure$: Observable; + + constructor( + private store: Store, + private http: HttpClient, + cfEndpointService: CloudFoundryEndpointService, + private currentUserPermissionsService: CurrentUserPermissionsService, + private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, + ) { + this.configured$ = cfEndpointService.endpoint$.pipe( + filter(v => !!v && !!v.entity), + // Note - metadata could be falsy if smtp server not configured/other metadata properties are missing + map(v => v.entity.metadata && v.entity.metadata.userInviteAllowed === 'true') + ); + this.canConfigure$ = combineLatest( + waitForCFPermissions(this.store, this.activeRouteCfOrgSpace.cfGuid), + this.store.select('auth') + ).pipe( + map(([cf, auth]) => + cf.global.isAdmin && + auth.sessionData['plugin-config'] && auth.sessionData['plugin-config'].userInvitationsEnabled === 'true') + ); } + + canShowInviteUser(cfGuid: string, orgGuid: string, spaceGuid: string): Observable { // Can only invite someone to an org or space and user must be admin or org manager return !orgGuid ? observableOf(false) : waitForCFPermissions(this.store, cfGuid).pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts index 48081d40ab..00b15b39e3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts @@ -3,9 +3,6 @@ import { Store } from '@ngrx/store'; import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { map } from 'rxjs/operators'; -import { IOrganization, ISpace } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { StackedInputActionResult, } from '../../../../../../../core/src/shared/components/stacked-input-actions/stacked-input-action/stacked-input-action.component'; @@ -16,9 +13,11 @@ import { import { StepOnNextFunction } from '../../../../../../../core/src/shared/components/stepper/step/step.component'; import { ClearPaginationOfType } from '../../../../../../../store/src/actions/pagination.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../../../../cf-types'; +import { IOrganization, ISpace } from '../../../../../cf-api.types'; import { CFAppState } from '../../../../../cf-app-state'; -import { cfUserEntityType, organizationEntityType, spaceEntityType } from '../../../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; +import { cfUserEntityType } from '../../../../../cf-entity-types'; +import { CFEntityConfig } from '../../../../../cf-types'; import { SpaceUserRoleNames } from '../../../../../store/types/user.types'; import { UserRoleLabels } from '../../../../../store/types/users-roles.types'; import { ActiveRouteCfOrgSpace } from '../../../cf-page.types'; @@ -45,7 +44,6 @@ export class InviteUsersCreateComponent implements OnInit { constructor( private store: Store, private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private entityServiceFactory: EntityServiceFactory, private userInviteService: UserInviteService ) { this.valid$ = this.stepValid.asObservable(); @@ -69,29 +67,17 @@ export class InviteUsersCreateComponent implements OnInit { ngOnInit() { this.isSpace = !!this.activeRouteCfOrgSpace.spaceGuid; - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder( + this.org$ = cfEntityCatalog.org.store.getEntityService( this.activeRouteCfOrgSpace.orgGuid, this.activeRouteCfOrgSpace.cfGuid, { includeRelations: [], populateMissing: false } - ); - this.org$ = this.entityServiceFactory.create>( - this.activeRouteCfOrgSpace.orgGuid, - getOrgAction ).waitForEntity$.pipe( map(entity => entity.entity) ); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + this.space$ = this.isSpace ? cfEntityCatalog.space.store.getEntityService( this.activeRouteCfOrgSpace.spaceGuid, this.activeRouteCfOrgSpace.cfGuid, { includeRelations: [], populateMissing: false } - ); - this.space$ = this.isSpace ? this.entityServiceFactory.create>( - this.activeRouteCfOrgSpace.spaceGuid, - getSpaceAction ).waitForEntity$.pipe( map(entity => entity.entity) ) : observableOf(null); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users.component.ts index 2b6345d244..4d51050514 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users.component.ts @@ -4,7 +4,7 @@ import { CfUserService } from '../../../../shared/data-services/cf-user.service' import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../../cf.helpers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; -import { UserInviteService } from '../../user-invites/user-invite.service'; +import { UserInviteConfigureService, UserInviteService } from '../../user-invites/user-invite.service'; import { CfRolesService } from '../manage-users/cf-roles.service'; @Component({ @@ -14,6 +14,7 @@ import { CfRolesService } from '../manage-users/cf-roles.service'; providers: [ getActiveRouteCfOrgSpaceProvider, UserInviteService, + UserInviteConfigureService, CfUserService, CfRolesService, CloudFoundryEndpointService diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts index f078fc0ed1..37cb95f700 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts @@ -17,14 +17,9 @@ import { createEntityRelationKey, createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { IOrganization, ISpace } from '../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsChecker } from '../../../../../../core/src/core/current-user-permissions.checker'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { selectUsersRolesCf, selectUsersRolesPicked, @@ -32,10 +27,10 @@ import { } from '../../../../../../store/src/selectors/users-roles.selector'; import { APIResource, EntityInfo } from '../../../../../../store/src/types/api.types'; import { UsersRolesSetChanges } from '../../../../actions/users-roles.actions'; +import { IOrganization, ISpace } from '../../../../cf-api.types'; import { CFAppState } from '../../../../cf-app-state'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { organizationEntityType, spaceEntityType } from '../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; import { CfUserService } from '../../../../shared/data-services/cf-user.service'; import { createDefaultOrgRoles, createDefaultSpaceRoles } from '../../../../store/reducers/users-roles.reducer'; import { CfUser, IUserPermissionInOrg, UserRoleInOrg, UserRoleInSpace } from '../../../../store/types/user.types'; @@ -94,8 +89,6 @@ export class CfRolesService { constructor( private store: Store, private cfUserService: CfUserService, - private entityServiceFactory: EntityServiceFactory, - private paginationMonitorFactory: PaginationMonitorFactory, private userPerms: CurrentUserPermissionsService, ) { this.existingRoles$ = this.store.select(selectUsersRolesPicked).pipe( @@ -233,13 +226,8 @@ export class CfRolesService { } fetchOrg(cfGuid: string, orgGuid: string): Observable>> { - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(orgGuid, cfGuid, { includeRelations: [], populateMissing: false }); - return this.entityServiceFactory.create>( - orgGuid, - getOrgAction - ).waitForEntity$; + return cfEntityCatalog.org.store.getEntityService(orgGuid, cfGuid, { includeRelations: [], populateMissing: false }) + .waitForEntity$; } fetchOrgEntity(cfGuid: string, orgGuid: string): Observable> { @@ -252,9 +240,7 @@ export class CfRolesService { fetchOrgs(cfGuid: string): Observable[]> { if (!this.cfOrgs[cfGuid]) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder( + const orgs$ = cfEntityCatalog.org.store.getPaginationService( cfGuid, paginationKey, { @@ -262,18 +248,7 @@ export class CfRolesService { createEntityRelationKey(organizationEntityType, spaceEntityType) ], populateMissing: true } - ); - const orgs$ = getPaginationObservables>({ - store: this.store, - action: getAllOrganizationsAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(organizationEntityType), - getAllOrganizationsAction.flattenPagination - ), - }, - getAllOrganizationsAction.flattenPagination - ).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/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts index eeebe25d3d..c3360df331 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts @@ -10,7 +10,7 @@ import { ITableCellRequestMonitorIconConfig, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectUsersRoles, selectUsersRolesChangedRoles, diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-modify/manage-users-modify.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-modify/manage-users-modify.component.ts index 1db4ca0090..4a03a0182b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-modify/manage-users-modify.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-modify/manage-users-modify.component.ts @@ -1,4 +1,3 @@ -/* tslint:disable:max-line-length */ import { ChangeDetectorRef, Component, @@ -13,6 +12,7 @@ import { } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { BehaviorSubject, combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { catchError, @@ -28,7 +28,6 @@ import { tap, } from 'rxjs/operators'; -import { IOrganization } from '../../../../../../../core/src/core/cf-api.types'; import { ITableListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; @@ -42,6 +41,7 @@ import { } from '../../../../../../../store/src/selectors/users-roles.selector'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { UsersRolesFlipSetRoles, UsersRolesSetOrg } from '../../../../../actions/users-roles.actions'; +import { IOrganization } from '../../../../../cf-api.types'; import { CFAppState } from '../../../../../cf-app-state'; import { TableCellRoleOrgSpaceComponent, @@ -51,10 +51,10 @@ import { } from '../../../../../shared/components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component'; import { CfUser, OrgUserRoleNames } from '../../../../../store/types/user.types'; import { ActiveRouteCfOrgSpace } from '../../../cf-page.types'; -import { getRowMetadata } from '../../../cf.helpers'; import { CfRolesService } from '../cf-roles.service'; import { SpaceRolesListWrapperComponent } from './space-roles-list-wrapper/space-roles-list-wrapper.component'; +/* tslint:disable:max-line-length */ /* tslint:enable:max-line-length */ @@ -83,6 +83,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { columnId: 'manager', headerCell: () => 'Manager', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: OrgUserRoleNames.MANAGER } @@ -91,6 +92,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { columnId: 'auditor', headerCell: () => 'Auditor', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: OrgUserRoleNames.AUDITOR } @@ -99,6 +101,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { columnId: 'billingManager', headerCell: () => 'Billing Manager', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: OrgUserRoleNames.BILLING_MANAGERS } @@ -107,6 +110,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { columnId: 'user', headerCell: () => 'User', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: OrgUserRoleNames.USER } @@ -304,7 +308,7 @@ export class UsersRolesModifyComponent implements OnInit, OnDestroy { this.store.select(selectUsersIsRemove).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/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.html b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.html index e743c0cb7e..c1d88ad0d8 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.html @@ -1,10 +1,10 @@
- + Add Roles{{(canAdd$ | async) ? '' : ' (Disabled via feature flag)'}} - + Remove Roles{{(canRemove$ | async) ? '' : ' (Disabled via feature flag)'}}
diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts index 3080140c03..db0ede2260 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-set-usernames/manage-users-set-usernames.component.ts @@ -1,12 +1,11 @@ import { Component, OnInit } from '@angular/core'; -import { MatRadioChange } from '@angular/material'; +import { MatRadioChange } from '@angular/material/radio'; import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs'; import { first, map, publishReplay, refCount, startWith, switchMap, take, tap } from 'rxjs/operators'; import { PermissionConfig, PermissionTypes } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { CFFeatureFlagTypes } from '../../../../../../../core/src/shared/components/cf-auth/cf-auth.types'; import { StackedInputActionConfig, } from '../../../../../../../core/src/shared/components/stacked-input-actions/stacked-input-action/stacked-input-action.component'; @@ -20,6 +19,7 @@ import { UsersRolesSetIsSetByUsername, UsersRolesSetUsers, } from '../../../../../actions/users-roles.actions'; +import { CFFeatureFlagTypes } from '../../../../../cf-api.types'; import { CFAppState } from '../../../../../cf-app-state'; import { CfUser } from '../../../../../store/types/user.types'; import { ActiveRouteCfOrgSpace } from '../../../cf-page.types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users.component.spec.ts index a62e2b598e..49c4be9fc8 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users.component.spec.ts @@ -7,8 +7,8 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../core/tab-nav.service'; -import { CfUserServiceTestProvider } from '../../../../../../core/test-framework/user-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfUserServiceTestProvider } from '../../../../../test-framework/user-service-helper'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { CfRolesService } from './cf-roles.service'; import { UsersRolesConfirmComponent } from './manage-users-confirm/manage-users-confirm.component'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/remove-user/remove-user.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/remove-user/remove-user.component.spec.ts index 74ec27b8e9..5879a847df 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/remove-user/remove-user.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/remove-user/remove-user.component.spec.ts @@ -1,3 +1,4 @@ +import { HttpClientModule } from '@angular/common/http'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; @@ -7,12 +8,11 @@ import { CoreModule } from '../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../core/src/shared/shared.module'; import { TabNavService } from '../../../../../../core/tab-nav.service'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfUserServiceTestProvider } from '../../../../../../core/test-framework/user-service-helper'; +import { CfUserServiceTestProvider } from '../../../../../test-framework/user-service-helper'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { CfRolesService } from '../manage-users//cf-roles.service'; import { UsersRolesConfirmComponent } from '../manage-users/manage-users-confirm/manage-users-confirm.component'; import { RemoveUserComponent } from './remove-user.component'; -import { HttpClientModule } from '@angular/common/http'; describe('RemoveUserComponent', () => { let component: RemoveUserComponent; diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts index fec927604f..20db0e5ca0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts @@ -1,19 +1,12 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { ServicesService } from '../services.service'; export function servicesServiceFactory( - store: Store, activatedRoute: ActivatedRoute, - entityServiceFactory: EntityServiceFactory, - paginationMonitorFactory: PaginationMonitorFactory ) { - return new ServicesService(store, entityServiceFactory, activatedRoute, paginationMonitorFactory); + return new ServicesService(activatedRoute); } @@ -25,14 +18,8 @@ export function servicesServiceFactory( { provide: ServicesService, useFactory: servicesServiceFactory, - deps: [Store, ActivatedRoute, EntityServiceFactory, PaginationMonitorFactory] + deps: [ActivatedRoute] } ] }) -export class ServiceBaseComponent { - - constructor(private servicesService: ServicesService, private store: Store) { - } - - -} +export class ServiceBaseComponent { } diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts index 2a74a1a3c5..a7cdbd8b7d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts @@ -1,24 +1,17 @@ import { Provider } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { ServicesService } from './services.service'; export function servicesServiceFactory( - store: Store, activatedRoute: ActivatedRoute, - entityServiceFactory: EntityServiceFactory, - paginationMonitorFactory: PaginationMonitorFactory ) { - return new ServicesService(store, entityServiceFactory, activatedRoute, paginationMonitorFactory); + return new ServicesService(activatedRoute); } export const servicesServiceFactoryProvider: Provider = { provide: ServicesService, useFactory: servicesServiceFactory, - deps: [Store, ActivatedRoute, EntityServiceFactory, PaginationMonitorFactory] + deps: [ActivatedRoute] }; diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.module.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.module.ts index 27c2c6566c..015bb2c5af 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { CreateApplicationModule } from '../applications/create-application/create-application.module'; import { ServiceBaseComponent } from './service-base/service-base.component'; import { ServiceCatalogPageComponent } from './service-catalog-page/service-catalog-page.component'; @@ -20,7 +20,7 @@ import { ServiceTabsBaseComponent } from './service-tabs-base/service-tabs-base. ServiceCatalogRoutingModule, CoreModule, CreateApplicationModule, - CloudFoundryComponentsModule, + CloudFoundrySharedModule, ], declarations: [ ServiceCatalogPageComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-summary/service-summary.component.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-summary/service-summary.component.ts index c163b4de45..4303146964 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-summary/service-summary.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-summary/service-summary.component.ts @@ -4,9 +4,9 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { IServiceInstance, IServicePlan } from '../../../../../core/src/core/cf-api-svc.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IServiceInstance, IServicePlan } from '../../../cf-api-svc.types'; import { ServicesService } from '../services.service'; @Component({ 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 248875a0ee..9f55596f21 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 @@ -4,6 +4,11 @@ import { Observable, of as observableOf } from 'rxjs'; import { combineLatest, filter, first, map, share, switchMap } from 'rxjs/operators'; import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; +import { getIdFromRoute, safeStringToObj } from '../../../../core/src/core/utils.service'; +import { StratosStatus } from '../../../../core/src/shared/shared.types'; +import { EntityService } from '../../../../store/src/entity-service'; +import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; +import { APIResource } from '../../../../store/src/types/api.types'; import { IService, IServiceBroker, @@ -12,30 +17,10 @@ import { IServicePlan, IServicePlanExtra, IServicePlanVisibility, -} from '../../../../core/src/core/cf-api-svc.types'; -import { getIdFromRoute, safeStringToObj } from '../../../../core/src/core/utils.service'; -import { StratosStatus } from '../../../../core/src/shared/shared.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../../../store/src/types/request.types'; +} from '../../cf-api-svc.types'; import { CFAppState } from '../../cf-app-state'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { - organizationEntityType, - serviceBrokerEntityType, - serviceEntityType, - serviceInstancesEntityType, - servicePlanEntityType, - spaceEntityType, -} from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../entity-action-builders/service-instance.action.builders'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { organizationEntityType, servicePlanEntityType, spaceEntityType } from '../../cf-entity-types'; import { QParam, QParamJoiners } from '../../shared/q-param'; import { fetchTotalResults } from '../cloud-foundry/cf.helpers'; import { ServicePlanAccessibility } from './services.service'; @@ -83,18 +68,6 @@ export const isEditServiceInstanceMode = (activatedRoute: ActivatedRoute) => { return !!cfId && !!serviceInstanceId; }; -export const getServiceInstancesInCf = (cfGuid: string, store: Store, paginationMonitorFactory: PaginationMonitorFactory) => { - const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); - return getPaginationObservables>({ - store, - action, - paginationMonitor: paginationMonitorFactory.create(paginationKey, action, action.flattenPagination) - }, action.flattenPagination).entities$; -}; - export const fetchServiceInstancesCount = ( cfGuid: string, orgGuid: string = null, @@ -103,14 +76,11 @@ export const fetchServiceInstancesCount = ( paginationMonitorFactory: PaginationMonitorFactory): Observable => { const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; const uniqueKey = spaceGuid || orgGuid || cfGuid; - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( + const action = cfEntityCatalog.serviceInstance.actions.getMultiple( cfGuid, createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), { includeRelations: [], populateMissing: false } - ); - action.initialParams.q = []; + ) if (orgGuid) { action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); } @@ -133,9 +103,7 @@ export const getServiceSummaryUrl = (cfGuid: string, serviceGuid: string): strin export const getServicePlans = ( service$: Observable>, - cfGuid: string, - store: Store, - paginationMonitorFactory: PaginationMonitorFactory + cfGuid: string ): Observable[]> => { return service$.pipe( filter(p => !!p), @@ -143,22 +111,12 @@ export const getServicePlans = ( if (service.entity.service_plans && service.entity.service_plans.length > 0) { return observableOf(service.entity.service_plans); } else { + // Could be a space-scoped service, make a request to fetch the plan const guid = service.metadata.guid; const paginationKey = createEntityRelationPaginationKey(servicePlanEntityType, guid); - const servicePlanEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanEntityType); - const actionBuilder = servicePlanEntity.actionOrchestrator.getActionBuilder('getAllForServiceInstance'); - const getServicePlansAction = actionBuilder(guid, cfGuid, paginationKey) as PaginatedAction; - // Could be a space-scoped service, make a request to fetch the plan - return getPaginationObservables>({ - store, - action: getServicePlansAction, - paginationMonitor: paginationMonitorFactory.create( - getServicePlansAction.paginationKey, - cfEntityFactory(servicePlanEntityType), - getServicePlansAction.flattenPagination - ) - }, getServicePlansAction.flattenPagination) - .entities$.pipe(share(), first()); + return cfEntityCatalog.servicePlan.store.getAllForServiceInstance.getPaginationService( + guid, cfGuid, paginationKey + ).entities$.pipe(share(), first()); } })); }; @@ -226,66 +184,26 @@ export const populateServicePlanExtraTyped = (servicePlan: APIResource( - serviceGuid: string, - entityRequestAction: EntityRequestAction, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - return entityServiceFactory.create>( - serviceGuid, - entityRequestAction - ); -}; - -export const getServiceBroker = ( - serviceBrokerGuid: string, - cfGuid: string, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceBrokerAction = actionBuilder(serviceBrokerGuid, cfGuid); - return getEntityService(serviceBrokerGuid, getServiceBrokerAction, entityServiceFactory); -}; - export const getServiceBrokerName = ( serviceBrokerGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory): Observable => { - return getServiceBroker(serviceBrokerGuid, cfGuid, entityServiceFactory).waitForEntity$.pipe( - filter(res => !!res), - map(a => a.entity.entity.name), - first() - ); -}; - -export const getCfService = ( - serviceGuid: string, - cfGuid: string, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceAction = actionBuilder(serviceGuid, cfGuid); - return getEntityService(serviceGuid, getServiceAction, entityServiceFactory); -}; +): Observable => cfEntityCatalog.serviceBroker.store.getEntityService(serviceBrokerGuid, cfGuid, {}).waitForEntity$.pipe( + filter(res => !!res), + map(a => a.entity.entity.name), + first() +); export const getCfServiceInstance = ( serviceInstanceGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory, includeRelations: string[] = null ): EntityService> => { - const entity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = entity.actionOrchestrator.getActionBuilder('get'); - const getAction = actionBuilder( + return cfEntityCatalog.serviceInstance.store.getEntityService( serviceInstanceGuid, cfGuid, { includeRelations, populateMissing: !!includeRelations } - ); - return getEntityService(serviceInstanceGuid, getAction, entityServiceFactory); + ) }; 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 e51f6b2275..a550800a57 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 @@ -1,9 +1,11 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; import { combineLatest, filter, first, map, publishReplay, refCount, switchMap } from 'rxjs/operators'; +import { getIdFromRoute } from '../../../../core/src/core/utils.service'; +import { EntityService } from '../../../../store/src/entity-service'; +import { APIResource } from '../../../../store/src/types/api.types'; import { IService, IServiceBroker, @@ -11,21 +13,11 @@ import { IServiceInstance, IServicePlan, IServicePlanVisibility, -} from '../../../../core/src/core/cf-api-svc.types'; -import { ISpace } from '../../../../core/src/core/cf-api.types'; -import { getIdFromRoute } from '../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../store/src/types/api.types'; -import { CFAppState } from '../../cf-app-state'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { serviceBrokerEntityType, servicePlanVisibilityEntityType, spaceEntityType } from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; +} from '../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { serviceBrokerEntityType, serviceInstancesEntityType, servicePlanVisibilityEntityType } from '../../cf-entity-types'; import { createEntityRelationPaginationKey } from '../../entity-relations/entity-relations.types'; -import { getCfService, getServiceInstancesInCf, getServiceName, getServicePlans } from './services-helper'; +import { getServiceName, getServicePlans } from './services-helper'; export interface ServicePlanAccessibility { @@ -59,67 +51,19 @@ export class ServicesService { initialised$ = new BehaviorSubject(false); constructor( - private store: Store, - private entityServiceFactory: EntityServiceFactory, public activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory - ) { this.cfGuid = getIdFromRoute(activatedRoute, 'endpointId'); this.serviceGuid = getIdFromRoute(activatedRoute, 'serviceId'); - this.serviceEntityService = getCfService(this.serviceGuid, this.cfGuid, this.entityServiceFactory); - this.service$ = this.serviceEntityService.waitForEntity$.pipe( - filter(o => !!o && !!o.entity), - map(o => o.entity), - publishReplay(1), - refCount() - ); + this.initServicesObservables(); - this.initBaseObservables(); + if (this.serviceGuid) { + this.initServiceObservables(); + } } - getServicePlanVisibilities = () => { - const paginationKey = createEntityRelationPaginationKey(servicePlanVisibilityEntityType, this.cfGuid); - const servicePlanVisibilityEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanVisibilityEntityType); - const actionBuilder = servicePlanVisibilityEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicePlanVisibilitiesAction = actionBuilder(this.cfGuid, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServicePlanVisibilitiesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(servicePlanVisibilityEntityType), - getServicePlanVisibilitiesAction.flattenPagination - ) - }, - getServicePlanVisibilitiesAction.flattenPagination - ).entities$; - } - private getServiceInstances = () => { - return getServiceInstancesInCf(this.cfGuid, this.store, this.paginationMonitorFactory); - } - - private getServiceBrokers = () => { - const paginationKey = createEntityRelationPaginationKey(serviceBrokerEntityType, this.cfGuid); - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServiceBrokersAction = actionBuilder(this.cfGuid, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServiceBrokersAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceBrokerEntityType), - getServiceBrokersAction.flattenPagination - ) - }, - getServiceBrokersAction.flattenPagination - ).entities$; - } getServiceBrokerById = (guid: string): Observable> => this.serviceBrokers$ .pipe( @@ -130,37 +74,17 @@ export class ServicesService { first() ) - getServiceName = () => { - return this.service$ - .pipe( - map(getServiceName) - ); - } - - getServiceProviderName = () => { - return observableCombineLatest(this.serviceExtraInfo$, this.service$) - .pipe( - map(([extraInfo]) => { - if (extraInfo && extraInfo.providerDisplayName) { - return extraInfo.providerDisplayName; - } else { - return ''; - } - })); - } + getServiceName = () => this.service$.pipe( + map(getServiceName) + ) - getServiceDescription = () => { - return observableCombineLatest(this.serviceExtraInfo$, this.service$) - .pipe( - map(([extraInfo, service]) => { - if (extraInfo && extraInfo.longDescription) { - return extraInfo.longDescription; - } else { - return service.entity.description; - } - })); - } + getServiceProviderName = () => observableCombineLatest(this.serviceExtraInfo$, this.service$).pipe( + map(([extraInfo]) => extraInfo && extraInfo.providerDisplayName ? extraInfo.providerDisplayName : '') + ); + getServiceDescription = () => observableCombineLatest(this.serviceExtraInfo$, this.service$).pipe( + map(([extraInfo, service]) => extraInfo && extraInfo.longDescription ? extraInfo.longDescription : service.entity.description) + ); getDocumentationUrl = () => this.serviceExtraInfo$.pipe( map(p => p ? p.documentationUrl : null) @@ -188,11 +112,19 @@ export class ServicesService { ) ) - private initBaseObservables() { - this.servicePlanVisibilities$ = this.getServicePlanVisibilities(); + /** + * Init observables specific to a service + */ + private initServiceObservables() { + this.serviceEntityService = cfEntityCatalog.service.store.getEntityService(this.serviceGuid, this.cfGuid, {}); + this.service$ = this.serviceEntityService.waitForEntity$.pipe( + filter(o => !!o && !!o.entity), + map(o => o.entity), + publishReplay(1), + refCount() + ); this.serviceExtraInfo$ = this.service$.pipe(map(o => JSON.parse(o.entity.extra))); - this.servicePlans$ = getServicePlans(this.service$, this.cfGuid, this.store, this.paginationMonitorFactory); - this.serviceBrokers$ = this.getServiceBrokers(); + this.servicePlans$ = getServicePlans(this.service$, this.cfGuid); this.serviceBroker$ = this.serviceBrokers$.pipe( filter(p => !!p && p.length > 0), combineLatest(this.service$), @@ -210,14 +142,7 @@ export class ServicesService { isSpaceScoped: false }); } else { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(spaceGuid, this.cfGuid); - const spaceEntityService = this.entityServiceFactory.create>( - spaceGuid, - getSpaceAction - ); - return spaceEntityService.waitForEntity$.pipe( + return cfEntityCatalog.space.store.getEntityService(spaceGuid, this.cfGuid).waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => ({ isSpaceScoped: true, @@ -228,9 +153,30 @@ export class ServicesService { } }) ); - this.allServiceInstances$ = this.getServiceInstances(); this.serviceInstances$ = this.allServiceInstances$.pipe( map(instances => instances.filter(instance => instance.entity.service_guid === this.serviceGuid)) ); } + + /** + * Init observables of service related cf level types + */ + private initServicesObservables() { + this.servicePlanVisibilities$ = cfEntityCatalog.servicePlanVisibility.store.getPaginationService( + this.cfGuid, + createEntityRelationPaginationKey(servicePlanVisibilityEntityType, this.cfGuid), + {} + ).entities$; + + this.serviceBrokers$ = cfEntityCatalog.serviceBroker.store.getPaginationService( + this.cfGuid, + createEntityRelationPaginationKey(serviceBrokerEntityType, this.cfGuid), + {} + ).entities$; + + this.allServiceInstances$ = cfEntityCatalog.serviceInstance.store.getPaginationService( + this.cfGuid, + createEntityRelationPaginationKey(serviceInstancesEntityType, this.cfGuid) + ).entities$; + } } diff --git a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.spec.ts index fc5e06cea0..f74c8c4095 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.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 { generateCfBaseTestModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { DetachAppsComponent } from './detach-apps.component'; @@ -12,7 +13,19 @@ describe('DetachAppsComponent', () => { TestBed.configureTestingModule({ declarations: [DetachAppsComponent], imports: generateCfBaseTestModules(), - providers: [DatePipe] + providers: [ + DatePipe, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + serviceInstanceId: 'serviceInstanceId', + endpointId: 'endpointId' + } + } + } + }, + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.ts b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.ts index ce4e523171..96bcc9cb02 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-apps/detach-apps.component.ts @@ -2,12 +2,12 @@ import { Component, EventEmitter, OnDestroy, Output } from '@angular/core'; import { Observable, of as observableOf, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; -import { IServiceBinding } from '../../../../../../core/src/core/cf-api-svc.types'; +import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; +import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../../../cf-api-svc.types'; import { DetachAppsListConfigService, } from '../../../../shared/components/list/list-types/detach-apps/detach-apps-list-config.service'; -import { ListConfig } from '../../../../../../core/src/shared/components/list/list.component.types'; -import { APIResource } from '../../../../../../store/src/types/api.types'; @Component({ selector: 'app-detach-apps', diff --git a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.spec.ts b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.spec.ts index 967e1722f2..32ecc4e292 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.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/tab-nav.service'; import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; @@ -15,7 +16,22 @@ describe('DetachServiceInstanceComponent', () => { TestBed.configureTestingModule({ declarations: [DetachServiceInstanceComponent, DetachAppsComponent], imports: generateCfBaseTestModules(), - providers: [DatePipe, TabNavService, ServiceActionHelperService] + providers: [ + DatePipe, + TabNavService, + ServiceActionHelperService, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + serviceInstanceId: 'serviceInstanceId', + endpointId: 'endpointId' + }, + queryParams: {} + }, + } + }, + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts index 8db10f06a6..7aa6ae8ae2 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts @@ -5,21 +5,21 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf, ReplaySubject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType, serviceInstancesEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; +import { serviceBindingEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { ServiceActionHelperService, } from '../../../../../cloud-foundry/src/shared/data-services/service-action-helper.service'; -import { IServiceBinding, IServiceInstance } from '../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { AppMonitorComponentTypes, } from '../../../../../core/src/shared/components/app-action-monitor-icon/app-action-monitor-icon.component'; import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../../cf-types'; @Component({ selector: 'app-detach-service-instance', @@ -61,24 +61,14 @@ export class DetachServiceInstanceComponent { private store: Store, private datePipe: DatePipe, private serviceActionHelperService: ServiceActionHelperService, - private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory + activatedRoute: ActivatedRoute, ) { this.cfGuid = activatedRoute.snapshot.params.endpointId; const serviceInstanceId = activatedRoute.snapshot.params.serviceInstanceId; - - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(serviceInstanceId, this.cfGuid); - const serviceBindingEntityService = this.entityServiceFactory.create>( - serviceInstanceId, - getServiceInstanceAction - ); - this.title$ = serviceBindingEntityService.waitForEntity$.pipe( + this.title$ = cfEntityCatalog.serviceInstance.store.getEntityService(serviceInstanceId, this.cfGuid).waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => `Unbind apps from '${o.entity.entity.name}'`), ); - } getId = (el: APIResource) => el.metadata.guid; diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services.module.ts b/src/frontend/packages/cloud-foundry/src/features/services/services.module.ts index 58a6326f70..628dced999 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services.module.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/services.module.ts @@ -7,7 +7,7 @@ import { import { ServiceCatalogModule } from '../../../../cloud-foundry/src/features/service-catalog/service-catalog.module'; import { CoreModule } from '../../../../core/src/core/core.module'; import { SharedModule } from '../../../../core/src/shared/shared.module'; -import { CloudFoundryComponentsModule } from '../../shared/components/components.module'; +import { CloudFoundrySharedModule } from '../../shared/cf-shared.module'; import { DetachAppsComponent } from './detach-service-instance/detach-apps/detach-apps.component'; import { DetachServiceInstanceComponent } from './detach-service-instance/detach-service-instance.component'; import { ServicesWallComponent } from './services-wall/services-wall.component'; @@ -21,7 +21,7 @@ import { ServicesRoutingModule } from './services.routing'; ServicesRoutingModule, ServiceCatalogModule, CreateApplicationModule, - CloudFoundryComponentsModule, + CloudFoundrySharedModule, ], declarations: [ ServicesWallComponent, diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.spec.ts b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.spec.ts index 02d21f816b..a8dd3e4d0f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.spec.ts @@ -1,6 +1,7 @@ import { inject, TestBed } from '@angular/core/testing'; import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfBaseTestModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ServicesWallService } from './services-wall.service'; @@ -10,6 +11,7 @@ describe('ServicesWallService', () => { TestBed.configureTestingModule({ providers: [ServicesWallService, EntityServiceFactory, + EntityMonitorFactory, PaginationMonitorFactory], imports: generateCfBaseTestModules() }); 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 3d76cfcc5c..c6ebd18e85 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 @@ -1,48 +1,25 @@ import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { filter, map, publishReplay, refCount } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { serviceEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { IService } from '../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; +import { IService } from '../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../entity-relations/entity-relations.types'; @Injectable() export class ServicesWallService { services$: Observable[]>; - constructor( - private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory - ) { + constructor() { this.services$ = this.initServicesObservable(); } initServicesObservable = () => { - const paginationKey = createEntityRelationPaginationKey(serviceEntityType); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicesAction = actionBuilder(null, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServicesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceEntityType), - getServicesAction.flattenPagination - ) - }, - getServicesAction.flattenPagination - ).entities$; + const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey); + return cfEntityCatalog.service.store.getPaginationService(null, paginationKey, {}).entities$ } getServicesInCf = (cfGuid: string) => this.services$.pipe( @@ -59,20 +36,6 @@ export class ServicesWallService { getServicesInSpace = (cfGuid: string, spaceGuid: string) => { const paginationKey = this.getSpaceServicePagKey(cfGuid, spaceGuid); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const getAllServicesForSpaceAction = actionBuilder(cfGuid, paginationKey, spaceGuid) as PaginatedAction; - return getPaginationObservables>( - { - store: this.store, - action: getAllServicesForSpaceAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceEntityType), - getAllServicesForSpaceAction.flattenPagination - ) - }, - getAllServicesForSpaceAction.flattenPagination - ).entities$; + return cfEntityCatalog.service.store.getAllInSpace.getPaginationService(cfGuid, paginationKey, spaceGuid).entities$; } } 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 new file mode 100644 index 0000000000..6c0ce65be1 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/shared/cf-shared.module.ts @@ -0,0 +1,382 @@ +import { CommonModule } from '@angular/common'; +import { ApplicationModule, NgModule, Type } from '@angular/core'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; + +import { CoreModule } from '../../../core/src/core/core.module'; +import { CardCell, TableCellCustom } from '../../../core/src/shared/components/list/list.types'; +import { SharedModule } from '../../../core/src/shared/shared.module'; +import { + ApplicationInstanceChartComponent, +} from '../features/applications/application/application-instance-chart/application-instance-chart.component'; +import { + AddServiceInstanceBaseStepComponent, +} from './components/add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component'; +import { + AddServiceInstanceComponent, +} from './components/add-service-instance/add-service-instance/add-service-instance.component'; +import { BindAppsStepComponent } from './components/add-service-instance/bind-apps-step/bind-apps-step.component'; +import { NoServicePlansComponent } from './components/add-service-instance/no-service-plans/no-service-plans.component'; +import { SelectPlanStepComponent } from './components/add-service-instance/select-plan-step/select-plan-step.component'; +import { + SpecifyDetailsStepComponent, +} from './components/add-service-instance/specify-details-step/specify-details-step.component'; +import { + SpecifyUserProvidedDetailsComponent, +} from './components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component'; +import { CardAppInstancesComponent } from './components/cards/card-app-instances/card-app-instances.component'; +import { CardAppStatusComponent } from './components/cards/card-app-status/card-app-status.component'; +import { CardAppUptimeComponent } from './components/cards/card-app-uptime/card-app-uptime.component'; +import { CardAppUsageComponent } from './components/cards/card-app-usage/card-app-usage.component'; +import { CardCfInfoComponent } from './components/cards/card-cf-info/card-cf-info.component'; +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 { + CompactServiceInstanceCardComponent, +} from './components/cards/compact-service-instance-card/compact-service-instance-card.component'; +import { ServiceBrokerCardComponent } from './components/cards/service-broker-card/service-broker-card.component'; +import { + ServiceRecentInstancesCardComponent, +} from './components/cards/service-recent-instances-card/service-recent-instances-card.component'; +import { ServiceSummaryCardComponent } from './components/cards/service-summary-card/service-summary-card.component'; +import { CfEndpointDetailsComponent } from './components/cf-endpoint-details/cf-endpoint-details.component'; +import { CfEndpointsMissingComponent } from './components/cf-endpoints-missing/cf-endpoints-missing.component'; +import { CfOrgSpaceLinksComponent } from './components/cf-org-space-links/cf-org-space-links.component'; +import { CfRoleCheckboxComponent } from './components/cf-role-checkbox/cf-role-checkbox.component'; +import { CliCommandComponent } from './components/cli-info/cli-command/cli-command.component'; +import { CliInfoComponent } from './components/cli-info/cli-info.component'; +import { CloudFoundryEventsListComponent } from './components/cloud-foundry-events-list/cloud-foundry-events-list.component'; +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'; +import { + TableCellUsageComponent, +} from './components/list/list-types/app-instance/table-cell-usage/table-cell-usage.component'; +import { + AppServiceBindingCardComponent, +} from './components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component'; +import { + TableCellEditVariableComponent, +} from './components/list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component'; +import { CardAppComponent } from './components/list/list-types/app/card/card-app.component'; +import { + TableCellAppCfOrgSpaceHeaderComponent, +} from './components/list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component'; +import { + TableCellAppCfOrgSpaceComponent, +} from './components/list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component'; +import { + TableCellAppInstancesComponent, +} from './components/list/list-types/app/table-cell-app-instances/table-cell-app-instances.component'; +import { + TableCellAppNameComponent, +} from './components/list/list-types/app/table-cell-app-name/table-cell-app-name.component'; +import { + TableCellAppStatusComponent, +} from './components/list/list-types/app/table-cell-app-status/table-cell-app-status.component'; +import { + CfBuildpackCardComponent, +} from './components/list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component'; +import { + TableCellConfirmOrgSpaceComponent, +} from './components/list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component'; +import { + TableCellConfirmRoleAddRemComponent, +} from './components/list/list-types/cf-confirm-roles/table-cell-confirm-role-add-rem/table-cell-confirm-role-add-rem.component'; +import { EventMetadataComponent } from './components/list/list-types/cf-events/event-metadata/event-metadata.component'; +import { + TableCellEventActeeComponent, +} from './components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component'; +import { + EventTabActorIconPipe, +} from './components/list/list-types/cf-events/table-cell-event-action/event-tab-actor-icon.pipe'; +import { + TableCellEventActionComponent, +} from './components/list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component'; +import { + TableCellEventDetailComponent, +} from './components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component'; +import { + TableCellEventTimestampComponent, +} from './components/list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component'; +import { + TableCellEventTypeComponent, +} from './components/list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component'; +import { + TableCellFeatureFlagDescriptionComponent, +} from './components/list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component'; +import { + TableCellFeatureFlagStateComponent, +} from './components/list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component'; +import { CfOrgCardComponent } from './components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component'; +import { TableCellQuotaComponent } from './components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component'; +import { + TableCellRouteAppsAttachedComponent, +} from './components/list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component'; +import { TableCellRouteComponent } from './components/list/list-types/cf-routes/table-cell-route/table-cell-route.component'; +import { + TableCellTCPRouteComponent, +} from './components/list/list-types/cf-routes/table-cell-tcproute/table-cell-tcproute.component'; +import { + CfSecurityGroupsCardComponent, +} from './components/list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component'; +import { CfServiceCardComponent } from './components/list/list-types/cf-services/cf-service-card/cf-service-card.component'; +import { + TableCellServiceActiveComponent, +} from './components/list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component'; +import { + TableCellServiceBindableComponent, +} from './components/list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component'; +import { + TableCellServiceCfBreadcrumbsComponent, +} from './components/list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component'; +import { + TableCellServiceProviderComponent, +} from './components/list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component'; +import { + TableCellServiceReferencesComponent, +} from './components/list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component'; +import { + TableCellServiceTagsComponent, +} from './components/list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component'; +import { + TableCellServiceInstanceAppsAttachedComponent, +} from './components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component'; +import { + TableCellServiceInstanceTagsComponent, +} from './components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component'; +import { + TableCellServiceLastOpComponent, +} from './components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component'; +import { + TableCellServiceComponent, +} from './components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component'; +import { + TableCellSpaceNameComponent, +} from './components/list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component'; +import { CfSpaceCardComponent } from './components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component'; +import { CfStacksCardComponent } from './components/list/list-types/cf-stacks/cf-stacks-card/cf-stacks-card.component'; +import { + TableCellRoleOrgSpaceComponent, +} from './components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component'; +import { + TableCellSelectOrgComponent, +} from './components/list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component'; +import { + CfOrgPermissionCellComponent, +} from './components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component'; +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'; +import { + TableCellAServicePlanPriceComponent, +} from './components/list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component'; +import { + TableCellAServicePlanPublicComponent, +} from './components/list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component'; +import { + ServiceInstanceCardComponent, +} from './components/list/list-types/services-wall/service-instance-card/service-instance-card.component'; +import { + UserProvidedServiceInstanceCardComponent, +} from './components/list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component'; +import { RunningInstancesComponent } from './components/running-instances/running-instances.component'; +import { SchemaFormComponent } from './components/schema-form/schema-form.component'; +import { SelectServiceComponent } from './components/select-service/select-service.component'; +import { ServiceIconComponent } from './components/service-icon/service-icon.component'; +import { ServiceInstanceLastOpComponent } from './components/service-instance-last-op/service-instance-last-op.component'; +import { ServicePlanPriceComponent } from './components/service-plan-price/service-plan-price.component'; +import { ServicePlanPublicComponent } from './components/service-plan-public/service-plan-public.component'; +import { GitSCMService } from './data-services/scm/scm.service'; +import { AppNameUniqueDirective } from './directives/app-name-unique.directive/app-name-unique.directive'; +import { ApplicationStateService } from './services/application-state.service'; +import { CloudFoundryUserProvidedServicesService } from './services/cloud-foundry-user-provided-services.service'; + +// tslint:disable:max-line-length +// tslint:enable:max-line-length + +const cfListTableCells: Type>[] = [ + TableCellServiceInstanceAppsAttachedComponent, + TableCellServiceComponent, + TableCellServiceLastOpComponent, + TableCellRouteAppsAttachedComponent, + CfOrgPermissionCellComponent, + CfSpacePermissionCellComponent, + TableCellFeatureFlagStateComponent, + TableCellFeatureFlagDescriptionComponent, + TableCellConfirmOrgSpaceComponent, + TableCellSelectOrgComponent, + TableCellAppStatusComponent, + TableCellRoleOrgSpaceComponent, + TableCellConfirmRoleAddRemComponent, + TableCellSpaceNameComponent, + TableCellAppCfOrgSpaceHeaderComponent, + TableCellAppCfOrgSpaceComponent, + TableCellAServicePlanPublicComponent, + TableCellAServicePlanPriceComponent, + TableCellAServicePlanExtrasComponent, + TableCellCfCellComponent, + TableCellRouteComponent, + TableCellTCPRouteComponent, + TableCellAppInstancesComponent, + TableCellAppNameComponent, + TableCellEditVariableComponent, + TableCellEventTimestampComponent, + TableCellEventTypeComponent, + TableCellEventActionComponent, + TableCellEventDetailComponent, + TableCellUsageComponent, + TableCellQuotaComponent, + TableCellEventActeeComponent, + TableCellServiceTagsComponent, + TableCellServiceCfBreadcrumbsComponent, + TableCellServiceProviderComponent, + TableCellServiceBindableComponent, + TableCellServiceActiveComponent, + TableCellServiceReferencesComponent, + TableCellServiceInstanceTagsComponent, + TableCellCommitAuthorComponent, +]; + +const cfListCards: Type>[] = [ + AppServiceBindingCardComponent, + CardAppComponent, + CfOrgCardComponent, + CfSpaceCardComponent, + CfBuildpackCardComponent, + CfSecurityGroupsCardComponent, + CfStacksCardComponent, + CfServiceCardComponent, + ServiceInstanceCardComponent, + UserProvidedServiceInstanceCardComponent, +]; + +// listTableCells.push(); + +@NgModule({ + imports: [ + CommonModule, + CoreModule, + SharedModule, + ApplicationModule, + MaterialDesignFrameworkModule, + ], + declarations: [ + ServiceIconComponent, + CfEndpointDetailsComponent, + CliCommandComponent, + CliInfoComponent, + CfEndpointsMissingComponent, + CfRoleCheckboxComponent, + CfOrgSpaceLinksComponent, + SelectServiceComponent, + SpecifyDetailsStepComponent, + AddServiceInstanceComponent, + SelectPlanStepComponent, + NoServicePlansComponent, + BindAppsStepComponent, + SpecifyUserProvidedDetailsComponent, + AddServiceInstanceBaseStepComponent, + SchemaFormComponent, + CardAppStatusComponent, + CardAppInstancesComponent, + CardAppUsageComponent, + CardAppUptimeComponent, + CardCfInfoComponent, + CardCfUserInfoComponent, + CardCfOrgUserDetailsComponent, + CardCfSpaceDetailsComponent, + CardCfRecentAppsComponent, + CompactAppCardComponent, + ServiceSummaryCardComponent, + ServiceBrokerCardComponent, + ServiceRecentInstancesCardComponent, + CompactServiceInstanceCardComponent, + RunningInstancesComponent, + ServicePlanPublicComponent, + ServicePlanPriceComponent, + CreateApplicationStep1Component, + EventTabActorIconPipe, + CloudFoundryEventsListComponent, + EventMetadataComponent, + ...cfListTableCells, + ...cfListCards, + ServiceInstanceLastOpComponent, + TableCellFeatureFlagDescriptionComponent, + AppNameUniqueDirective, + ApplicationInstanceChartComponent, + GithubCommitAuthorComponent, + EnvVarViewComponent + ], + exports: [ + ServiceIconComponent, + CfEndpointDetailsComponent, + CliCommandComponent, + CliInfoComponent, + CfEndpointsMissingComponent, + CfRoleCheckboxComponent, + CfOrgSpaceLinksComponent, + SelectServiceComponent, + SpecifyDetailsStepComponent, + AddServiceInstanceComponent, + SelectPlanStepComponent, + NoServicePlansComponent, + BindAppsStepComponent, + SpecifyUserProvidedDetailsComponent, + AddServiceInstanceBaseStepComponent, + CfServiceCardComponent, + SchemaFormComponent, + CardAppStatusComponent, + CardAppInstancesComponent, + CardAppUsageComponent, + CardAppUptimeComponent, + CardCfInfoComponent, + CardCfUserInfoComponent, + CardCfOrgUserDetailsComponent, + CardCfSpaceDetailsComponent, + CardCfRecentAppsComponent, + CompactAppCardComponent, + ServiceSummaryCardComponent, + ServiceBrokerCardComponent, + ServiceRecentInstancesCardComponent, + CompactServiceInstanceCardComponent, + RunningInstancesComponent, + ServicePlanPublicComponent, + ServicePlanPriceComponent, + CreateApplicationStep1Component, + CloudFoundryEventsListComponent, + AppNameUniqueDirective, + ApplicationInstanceChartComponent, + GithubCommitAuthorComponent, + EnvVarViewComponent + ], + entryComponents: [ + CfEndpointDetailsComponent, + NoServicePlansComponent, + EventMetadataComponent, + EnvVarViewComponent, + ...cfListTableCells, + ...cfListCards + ], + providers: [ + ApplicationStateService, + GitSCMService, + CloudFoundryUserProvidedServicesService, + ] +}) +export class CloudFoundrySharedModule { } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.spec.ts index 2ed822d223..daa030668e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.spec.ts @@ -1,9 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; -import { - AppNameUniqueDirective, -} from '../../../../../../core/src/shared/app-name-unique.directive/app-name-unique.directive'; import { ApplicationStateIconComponent, } from '../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; @@ -15,6 +12,9 @@ import { } from '../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; import { CardStatusComponent } from '../../../../../../core/src/shared/components/cards/card-status/card-status.component'; import { AppChipsComponent } from '../../../../../../core/src/shared/components/chips/chips.component'; +import { + CopyToClipboardComponent, +} from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; import { FocusDirective } from '../../../../../../core/src/shared/components/focus.directive'; import { MetaCardComponent, @@ -37,16 +37,17 @@ import { } from '../../../../../../core/src/shared/components/multiline-title/multiline-title.component'; import { PageHeaderModule } from '../../../../../../core/src/shared/components/page-header/page-header.module'; import { SteppersModule } from '../../../../../../core/src/shared/components/stepper/steppers.module'; +import { TabNavService } from '../../../../../../core/tab-nav.service'; import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../../../../store/src/monitors/internal-event-monitor.factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { TabNavService } from '../../../../../../core/tab-nav.service'; import { generateCfBaseTestModulesNoShared } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ServicesService } from '../../../../features/service-catalog/services.service'; import { ServicesServiceMock } from '../../../../features/service-catalog/services.service.mock'; import { CfOrgSpaceDataService } from '../../../data-services/cf-org-space-service.service'; import { CloudFoundryService } from '../../../data-services/cloud-foundry.service'; import { LongRunningCfOperationsService } from '../../../data-services/long-running-cf-op.service'; +import { AppNameUniqueDirective } from '../../../directives/app-name-unique.directive/app-name-unique.directive'; import { CfOrgSpaceLinksComponent } from '../../cf-org-space-links/cf-org-space-links.component'; import { CreateApplicationStep1Component, @@ -79,7 +80,6 @@ import { SpecifyUserProvidedDetailsComponent, } from '../specify-user-provided-details/specify-user-provided-details.component'; import { AddServiceInstanceComponent } from './add-service-instance.component'; -import { CopyToClipboardComponent } from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; describe('AddServiceInstanceComponent', () => { let component: AddServiceInstanceComponent; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts index dcdb7795b3..9d5809a14f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts @@ -16,7 +16,6 @@ import { tap, } from 'rxjs/operators'; -import { GetApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { ResetCreateServiceInstanceOrgAndSpaceState, ResetCreateServiceInstanceState, @@ -27,11 +26,7 @@ import { SetServiceInstanceGuid, } from '../../../../../../cloud-foundry/src/actions/create-service-instance.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - serviceInstancesEntityType, - spaceEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { applicationEntityType, spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationKey, createEntityRelationPaginationKey, @@ -45,21 +40,10 @@ import { import { selectCreateServiceInstance, } from '../../../../../../cloud-foundry/src/store/selectors/create-service-instance.selectors'; -import { IServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; -import { IApp, ISpace } from '../../../../../../core/src/core/cf-api.types'; import { getIdFromRoute } from '../../../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { ApplicationActionBuilders } from '../../../../entity-action-builders/application.action-builders'; -import { ServiceInstanceActionBuilders } from '../../../../entity-action-builders/service-instance.action.builders'; -import { SpaceActionBuilders } from '../../../../entity-action-builders/space.action-builders'; +import { IApp, ISpace } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { SERVICE_INSTANCE_TYPES } from '../add-service-instance-base-step/add-service-instance.types'; import { CreateServiceInstanceHelperServiceFactory } from '../create-service-instance-helper-service-factory.service'; import { CreateServiceInstanceHelper } from '../create-service-instance-helper.service'; @@ -102,30 +86,13 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit map(details => details.spaceGuid) ); - private serviceInstanceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceInstancesEntityType - ); - - private spaceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceEntityType - ); - - private appEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - applicationEntityType - ); - constructor( private cSIHelperServiceFactory: CreateServiceInstanceHelperServiceFactory, private activatedRoute: ActivatedRoute, private store: Store, private cfOrgSpaceService: CfOrgSpaceDataService, private csiGuidsService: CsiGuidsService, - private entityServiceFactory: EntityServiceFactory, public modeService: CsiModeService, - private paginationMonitorFactory: PaginationMonitorFactory, route: ActivatedRoute ) { const cfGuid = getIdFromRoute(this.activatedRoute, 'endpointId'); @@ -165,17 +132,9 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit switchMap(csi => { this.appsEmitted.next(false); const paginationKey = createEntityRelationPaginationKey(spaceEntityType, csi.spaceGuid); - const actionBuilder = this.appEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const getAllAppsInSpaceAction = actionBuilder(csi.spaceGuid, csi.cfGuid, paginationKey) as PaginatedAction; - return getPaginationObservables({ - store: this.store, - action: getAllAppsInSpaceAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(applicationEntityType), - getAllAppsInSpaceAction.flattenPagination - ) - }, getAllAppsInSpaceAction.flattenPagination).entities$; + return cfEntityCatalog.application.store.getAllInSpace.getPaginationService( + csi.spaceGuid, csi.cfGuid, paginationKey + ).entities$; }), tap(() => this.appsEmitted.next(true)), publishReplay(1), @@ -214,11 +173,12 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit const cfId = getIdFromRoute(this.activatedRoute, 'endpointId'); this.appId = appId; this.bindAppStepperText = 'Binding Params (Optional)'; - const entityService = this.entityServiceFactory.create>( + return cfEntityCatalog.application.store.getEntityService( appId, - new GetApplication(appId, cfId, [createEntityRelationKey(applicationEntityType, spaceEntityType)]) - ); - return entityService.waitForEntity$.pipe( + cfId, { + includeRelations: [createEntityRelationKey(applicationEntityType, spaceEntityType)] + } + ).waitForEntity$.pipe( filter(p => !!p), tap(app => { const spaceEntity = app.entity.entity.space as APIResource; @@ -238,8 +198,7 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit this.serviceInstanceId = serviceInstanceId; this.title$ = observableOf('Edit User Provided Service Instance'); } else { - const entityService = this.getServiceInstanceEntityService(serviceInstanceId, endpointId); - return entityService.waitForEntity$.pipe( + return cfEntityCatalog.serviceInstance.store.getEntityService(serviceInstanceId, endpointId).waitForEntity$.pipe( filter(p => !!p), tap(serviceInstance => { const serviceInstanceEntity = serviceInstance.entity.entity; @@ -257,8 +216,7 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit '' )); this.store.dispatch(new SetCreateServiceInstanceServicePlan(serviceInstanceEntity.service_plan_guid)); - const spaceEntityService = this.getSpaceEntityService(serviceInstanceEntity.space_guid, endpointId); - spaceEntityService.waitForEntity$.pipe( + cfEntityCatalog.space.store.getEntityService(serviceInstanceEntity.space_guid, endpointId).waitForEntity$.pipe( filter(p => !!p), tap(spaceEntity => { this.store.dispatch(new SetCreateServiceInstanceCFDetails( @@ -276,20 +234,6 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit } } - private getServiceInstanceEntityService(serviceInstanceId: string, cfId: string) { - return this.entityServiceFactory.create>( - serviceInstanceId, - this.serviceInstanceEntity.actionOrchestrator.getActionBuilder('get')(serviceInstanceId, cfId) - ); - } - - private getSpaceEntityService(spaceGuid: string, cfGuid: string) { - return this.entityServiceFactory.create>( - spaceGuid, - this.spaceEntity.actionOrchestrator.getActionBuilder('get')(spaceGuid, cfGuid) - ); - } - ngOnDestroy(): void { this.store.dispatch(new ResetCreateServiceInstanceState()); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.spec.ts index 022c3db64a..499fafe49f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.spec.ts @@ -1,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts index 2bba06cd52..7f5af3b6ea 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts @@ -5,12 +5,11 @@ import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'r import { SetCreateServiceInstanceApp } from '../../../../../../cloud-foundry/src/actions/create-service-instance.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { IServicePlan } from '../../../../../../core/src/core/cf-api-svc.types'; -import { IApp } from '../../../../../../core/src/core/cf-api.types'; import { pathGet, safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServicePlan } from '../../../../cf-api-svc.types'; +import { IApp } from '../../../../cf-api.types'; import { SchemaFormConfig } from '../../schema-form/schema-form.component'; @Component({ @@ -37,7 +36,6 @@ export class BindAppsStepComponent implements OnDestroy, AfterContentInit { constructor( private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory ) { this.stepperForm = new FormGroup({ apps: new FormControl(''), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts index db99edb66a..46bfdf8a89 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { CreateServiceInstanceHelper } from './create-service-instance-helper.service'; @@ -15,8 +13,6 @@ export class CreateServiceInstanceHelperServiceFactory { } = {}; constructor( private store: Store, - private entityServiceFactory: EntityServiceFactory, - private activatedRoute: ActivatedRoute, private paginationMonitorFactory: PaginationMonitorFactory ) { } @@ -30,7 +26,6 @@ export class CreateServiceInstanceHelperServiceFactory { this.store, serviceGuid, cfGuid, - this.entityServiceFactory, this.paginationMonitorFactory ); this.serviceInstanceCache[key] = instance; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts index 45bd998cc6..f79ffc547c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts @@ -9,27 +9,14 @@ import { servicePlanVisibilityEntityType, } from '../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { - IService, - IServiceBroker, - IServiceInstance, - IServicePlan, - IServicePlanVisibility, -} from '../../../../../core/src/core/cf-api-svc.types'; import { CF_GUID } from '../../../../../core/src/shared/entity.tokens'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IService, IServiceBroker, IServiceInstance, IServicePlan, IServicePlanVisibility } from '../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { - getCfService, - getServiceBroker, - getServiceName, - getServicePlans, -} from '../../../features/service-catalog/services-helper'; +import { getServiceName, getServicePlans } from '../../../features/service-catalog/services-helper'; import { QParam, QParamJoiners } from '../../q-param'; export class CreateServiceInstanceHelper { @@ -43,7 +30,6 @@ export class CreateServiceInstanceHelper { private store: Store, public serviceGuid: string, @Inject(CF_GUID) public cfGuid: string, - private entityServiceFactory: EntityServiceFactory, private paginationMonitorFactory: PaginationMonitorFactory ) { this.initBaseObservables(); @@ -51,9 +37,7 @@ export class CreateServiceInstanceHelper { initBaseObservables = () => { - const serviceEntityService = getCfService(this.serviceGuid, this.cfGuid, this.entityServiceFactory); - - this.service$ = serviceEntityService.waitForEntity$.pipe( + this.service$ = cfEntityCatalog.service.store.getEntityService(this.serviceGuid, this.cfGuid, {}).waitForEntity$.pipe( filter(o => !!o && !!o.entity && !!o.entity.entity && !!o.entity.entity.service_plans), // filter(o => !!o && !!o.entity), map(o => o.entity), @@ -62,41 +46,21 @@ export class CreateServiceInstanceHelper { ); this.serviceBroker$ = this.service$.pipe( - map(service => getServiceBroker(service.entity.service_broker_guid, this.cfGuid, this.entityServiceFactory)), + map(service => cfEntityCatalog.serviceBroker.store.getEntityService(service.entity.service_broker_guid, this.cfGuid, {})), switchMap(serviceService => serviceService.waitForEntity$), map(entity => entity.entity) ); const paginationKey = createEntityRelationPaginationKey(servicePlanVisibilityEntityType, this.cfGuid); - const servicePlanVisibilityEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanVisibilityEntityType); - const actionBuilder = servicePlanVisibilityEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicePlanVisibilitiesAction = actionBuilder(this.cfGuid, paginationKey); - this.servicePlanVisibilities$ = getPaginationObservables>( - { - store: this.store, - action: getServicePlanVisibilitiesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(servicePlanVisibilityEntityType), - getServicePlanVisibilitiesAction.flattenPagination - ) - }, - getServicePlanVisibilitiesAction.flattenPagination - ).entities$; - + this.servicePlanVisibilities$ = cfEntityCatalog.servicePlanVisibility.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } getServicePlanVisibilities = (): Observable[]> => this.servicePlanVisibilities$.pipe(filter(p => !!p)) - // getServicePlanVisibilitiesForOrg = (orgGuid: string): Observable[]> => - // this.servicePlanVisibilities$.pipe( - // filter(p => !!p), - // map(entities => entities.filter(entity => entity.entity.organization_guid === orgGuid)) - // ) getServicePlans(): Observable[]> { - return getServicePlans(this.service$, this.cfGuid, this.store, this.paginationMonitorFactory); + return getServicePlans(this.service$, this.cfGuid); } getServiceName = () => { @@ -107,98 +71,19 @@ export class CreateServiceInstanceHelper { ); } - // getSelectedServicePlan = (): Observable> => { - // return observableCombineLatest(this.store.select(selectCreateServiceInstanceServicePlan), this.getServicePlans()) - // .pipe( - // filter(([p, q]) => !!p && !!q), - // map(([servicePlanGuid, servicePlans]) => servicePlans.filter(o => o.metadata.guid === servicePlanGuid)), - // map(p => p[0]), filter(p => !!p) - // ); - // } - - // getSelectedServicePlanAccessibility = (): Observable => { - // return this.getSelectedServicePlan().pipe( - // switchMap(plan => getServicePlanAccessibility(plan, this.getServicePlanVisibilities())) - // ); - // } - - // getOrgsForSelectedServicePlan = (): Observable[]> => { - // return this.getSelectedServicePlan() - // .pipe( - // switchMap(servicePlan => getServicePlanAccessibility(servicePlan, this.getServicePlanVisibilities())), - // switchMap(servicePlanAccessibility => { - // if (servicePlanAccessibility.isPublic) { - // const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizationsLimitedSchema(this.cfGuid); - // return getPaginationObservables>({ - // store: this.store, - // action: getAllOrgsAction, - // paginationMonitor: this.paginationMonitorFactory.create( - // getAllOrgsAction.paginationKey, - // cfEntityFactory(organizationEntityType) - // ) - // }, true) - // .entities$.pipe(share(), first()); - // } else if (servicePlanAccessibility.spaceScoped) { - // // Service plan is not public, but is space-scoped - // const action = new GetSpace(servicePlanAccessibility.spaceGuid, this.cfGuid, - // [ - // createEntityRelationKey(spaceEntityType, organizationEntityType), - // ] - // ); - // action.entity = [cfEntityFactory(spaceWithOrgEntityType)]; - // return this.entityServiceFactory.create>( - // spaceEntityType, - // cfEntityFactory(spaceWithOrgEntityType), - // servicePlanAccessibility.spaceGuid, - // action, - // true - // ).waitForEntity$ - // .pipe( - // // Block until the org is either fetched or associated with existing entity - // filter(p => !!pathGet('entity.entity.organization.entity', p)), - // map((p) => { - // const orgEntity = { ...p.entity.entity.organization.entity, spaces: [p.entity] }; - // return [{ ...p.entity.entity.organization, entity: orgEntity }]; - // }), - // ); - // } else if (servicePlanAccessibility.hasVisibilities) { - // // Service plan is not public, fetch visibilities - // return this.getServicePlanVisibilitiesForPlan(servicePlanAccessibility.guid) - // .pipe( - // map(s => s.map(o => o.entity.organization)), - // ); - // } - // } - // ), - // share(), first() - // ); - // } - - // getServicePlanVisibilitiesForPlan = (servicePlanGuid: string): Observable[]> => { - // return this.getServicePlanVisibilities().pipe( - // filter(p => !!p), - // map(vis => vis.filter(s => s.entity.service_plan_guid === servicePlanGuid)), - // first() - // ); - // } - getServiceInstancesForService = (servicePlanGuid: string = null, spaceGuid: string = null, cfGuid: string = null) => { let action; let paginationKey; - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (spaceGuid) { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, `${spaceGuid}-${servicePlanGuid}`); const q = [new QParam('service_plan_guid', servicePlanGuid, QParamJoiners.colon).toString()]; - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - action = actionBuilder(spaceGuid, cfGuid, paginationKey, q); + action = cfEntityCatalog.serviceInstance.actions.getAllInSpace(spaceGuid, cfGuid, paginationKey, q) } else if (servicePlanGuid) { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, servicePlanGuid); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInServicePlan'); - action = actionBuilder(servicePlanGuid, cfGuid, paginationKey); + action = cfEntityCatalog.serviceInstance.actions.getAllInServicePlan(servicePlanGuid, cfGuid, paginationKey); } else { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - action = actionBuilder(cfGuid, paginationKey); + action = cfEntityCatalog.serviceInstance.actions.getMultiple(cfGuid, paginationKey); } return getPaginationObservables>({ store: this.store, @@ -214,24 +99,4 @@ export class CreateServiceInstanceHelper { refCount() ); } - - // getServicesForSpace = (spaceGuid: string, cfGuid: string) => { - // const paginationKey = createEntityRelationPaginationKey(serviceEntityType, spaceGuid); - // return getPaginationObservables>( - // { - // store: this.store, - // action: new GetAllServicesForSpace(paginationKey, cfGuid, spaceGuid), - // paginationMonitor: this.paginationMonitorFactory.create( - // paginationKey, - // entityFactory(serviceEntityType) - // ) - // }, - // true - // ).entities$.pipe( - // filter(p => !!p), - // publishReplay(1), - // refCount() - // ); - // } - } 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 f507f62e34..3c4fa72df5 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 @@ -1,15 +1,11 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { filter, map } from 'rxjs/operators'; +import { filter, map, pairwise } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { SpaceScopedService } from '../../../../../cloud-foundry/src/features/service-catalog/services.service'; -import { selectCfRequestInfo } from '../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { getIdFromRoute } from '../../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; +import { RequestInfoState } from '../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; export enum CreateServiceInstanceMode { MARKETPLACE_MODE = 'marketPlaceMode', @@ -54,7 +50,6 @@ export class CsiModeService { constructor( private activatedRoute: ActivatedRoute, - private store: Store ) { const serviceId = getIdFromRoute(activatedRoute, 'serviceId'); const serviceInstanceId = getIdFromRoute(activatedRoute, 'serviceInstanceId'); @@ -136,19 +131,14 @@ export class CsiModeService { public createApplicationServiceBinding(serviceInstanceGuid: string, cfGuid: string, appGuid: string, params: object) { const guid = `${cfGuid}-${appGuid}-${serviceInstanceGuid}`; - const servceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = servceBindingEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceBindingAction = actionBuilder( + return cfEntityCatalog.serviceBinding.api.create( guid, cfGuid, { applicationGuid: appGuid, serviceInstanceGuid, params } - ); - this.store.dispatch(createServiceBindingAction); - - return this.store.select(selectCfRequestInfo(serviceBindingEntityType, guid)).pipe( - filter(s => { - return s && !s.creating; - }), + ).pipe( + pairwise(), + filter(([oldS, newS]) => oldS.creating && !newS.creating), + map(([, newS]) => newS), map(req => { if (req.error) { return { success: false, message: `Failed to create service instance binding: ${req.message}` }; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/select-plan-step/select-plan-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/select-plan-step/select-plan-step.component.ts index 2912f86215..961ada73a1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/select-plan-step/select-plan-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/select-plan-step/select-plan-step.component.ts @@ -37,11 +37,11 @@ import { import { selectCreateServiceInstance, } from '../../../../../../cloud-foundry/src/store/selectors/create-service-instance.selectors'; -import { IServicePlan } from '../../../../../../core/src/core/cf-api-svc.types'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { StratosStatus } from '../../../../../../core/src/shared/shared.types'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServicePlan } from '../../../../cf-api-svc.types'; import { CreateServiceInstanceHelperServiceFactory } from '../create-service-instance-helper-service-factory.service'; import { CreateServiceInstanceHelper } from '../create-service-instance-helper.service'; import { CsiModeService } from '../csi-mode.service'; @@ -119,7 +119,7 @@ export class SelectPlanStepComponent implements OnDestroy { tap(selectedServicePlan => { getServicePlanAccessibilityCardStatus( selectedServicePlan, - this.cSIHelperService.getServicePlanVisibilities(), + this.cSIHelperService.servicePlanVisibilities$, this.cSIHelperService.serviceBroker$).pipe( first() ).subscribe(cardStatus => this.selectedPlanAccessibility$.next(cardStatus)); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.spec.ts index 2f022f71c7..164820d39a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.spec.ts @@ -1,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; 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 61ef2e0af5..80ed214a56 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 @@ -3,7 +3,13 @@ import { AfterContentInit, Component, Input, OnDestroy } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { MatChipInputEvent } from '@angular/material/chips'; import { Store } from '@ngrx/store'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; import { combineLatest, distinctUntilChanged, @@ -23,17 +29,16 @@ import { SetCreateServiceInstanceOrg, SetServiceInstanceGuid, } from '../../../../../../cloud-foundry/src/actions/create-service-instance.actions'; -import { IServiceInstance, IServicePlan } from '../../../../../../core/src/core/cf-api-svc.types'; import { pathGet, safeStringToObj } from '../../../../../../core/src/core/utils.service'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { getDefaultRequestState, RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource, NormalizedResponse } from '../../../../../../store/src/types/api.types'; import { UpdateServiceInstance } from '../../../../actions/service-instances.actions'; +import { IServiceInstance, IServicePlan } from '../../../../cf-api-svc.types'; import { CFAppState } from '../../../../cf-app-state'; -import { appEnvVarsEntityType, serviceBindingEntityType, serviceInstancesEntityType } from '../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; +import { serviceInstancesEntityType } from '../../../../cf-entity-types'; import { selectCfRequestInfo, selectCfUpdateInfo } from '../../../../store/selectors/api.selectors'; import { selectCreateServiceInstance, @@ -312,13 +317,7 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit return req; } else { // Refetch env vars for app, since they have been changed by CF - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(state.bindAppGuid, state.cfGuid); - this.store.dispatch( - getAppEnvVarsAction - ); - + cfEntityCatalog.appEnvVar.api.getMultiple(state.bindAppGuid, state.cfGuid); return this.routeToServices(state.cfGuid, state.bindAppGuid); } }) @@ -416,35 +415,26 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit tagsStr: string[], isEditMode: boolean ) { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (isEditMode) { - const updateActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('update'); - const updateServiceInstanceAction = updateActionBuilder( - cfGuid, + return cfEntityCatalog.serviceInstance.actions.update( newServiceInstanceGuid, + cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ); - return updateServiceInstanceAction; + ) } - const createActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceInstanceAction = createActionBuilder( - cfGuid, + return cfEntityCatalog.serviceInstance.actions.create( newServiceInstanceGuid, + cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ); - return createServiceInstanceAction; + ) } private getIdFromResponseGetter(cfGuid: string, newId: string, isEditMode: boolean) { return (response: NormalizedResponse) => { if (!isEditMode) { - // We need to re-fetch the Service Instance - // incase of creation because the entity returned is incomplete + // We need to re-fetch the Service Instance in case of creation because the entity returned is incomplete const guid = response.result[0]; - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(guid, cfGuid); - this.store.dispatch(getServiceInstanceAction); + cfEntityCatalog.serviceInstance.api.get(guid, cfGuid); return guid; } return newId; @@ -492,22 +482,6 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit ); } - - createBinding = (serviceInstanceGuid: string, cfGuid: string, appGuid: string, params: object) => { - - const guid = `${cfGuid}-${appGuid}-${serviceInstanceGuid}`; - const servceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = servceBindingEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceBindingAction = actionBuilder( - cfGuid, - guid, - { applicationGuid: appGuid, serviceInstanceGuid, params } - ); - this.store.dispatch(createServiceBindingAction); - - return this.store.select(selectCfRequestInfo(serviceBindingEntityType, guid)); - } - addTag(event: MatChipInputEvent): void { const input = event.input; const value = event.value; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.spec.ts index 11a2e8b372..4fa276d943 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.spec.ts @@ -3,6 +3,8 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { generateCfBaseTestModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { AppNameUniqueDirective } from '../../../directives/app-name-unique.directive/app-name-unique.directive'; +import { CloudFoundryUserProvidedServicesService } from '../../../services/cloud-foundry-user-provided-services.service'; import { CsiModeService } from '../csi-mode.service'; import { SpecifyUserProvidedDetailsComponent } from './specify-user-provided-details.component'; @@ -12,14 +14,18 @@ describe('SpecifyUserProvidedDetailsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [SpecifyUserProvidedDetailsComponent], + declarations: [ + SpecifyUserProvidedDetailsComponent, + AppNameUniqueDirective, + ], imports: [ ...generateCfBaseTestModules(), HttpClientModule, HttpClientTestingModule ], providers: [ - CsiModeService + CsiModeService, + CloudFoundryUserProvidedServicesService, ] }) .compileComponents(); 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 433f914488..a5d2b02b09 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 @@ -8,13 +8,9 @@ import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest as obsCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { combineLatest, filter, first, map, publishReplay, refCount, startWith, switchMap } from 'rxjs/operators'; -import { - IUserProvidedServiceInstanceData, - UpdateUserProvidedServiceInstance, -} from '../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; +import { IUserProvidedServiceInstanceData } from '../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { - appEnvVarsEntityType, serviceBindingEntityType, userProvidedServiceInstanceEntityType, } from '../../../../../../cloud-foundry/src/cf-entity-types'; @@ -22,20 +18,15 @@ import { createEntityRelationKey } from '../../../../../../cloud-foundry/src/ent import { selectCreateServiceInstance, } from '../../../../../../cloud-foundry/src/store/selectors/create-service-instance.selectors'; -import { IUserProvidedServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; import { safeUnsubscribe, urlValidationExpression } from '../../../../../../core/src/core/utils.service'; import { environment } from '../../../../../../core/src/environments/environment'; -import { - AppNameUniqueChecking, -} from '../../../../../../core/src/shared/app-name-unique.directive/app-name-unique.directive'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { isValidJsonValidator } from '../../../../../../core/src/shared/form-validators'; -import { - CloudFoundryUserProvidedServicesService, -} from '../../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { IUserProvidedServiceInstance } from '../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; +import { AppNameUniqueChecking } from '../../../directives/app-name-unique.directive/app-name-unique.directive'; +import { CloudFoundryUserProvidedServicesService } from '../../../services/cloud-foundry-user-provided-services.service'; import { CreateServiceFormMode, CsiModeService } from './../csi-mode.service'; const { proxyAPIVersion, cfAPIVersion } = environment; @@ -292,12 +283,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 - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(data.bindAppGuid, data.cfGuid); - this.store.dispatch( - getAppEnvVarsAction - ); + cfEntityCatalog.appEnvVar.api.getMultiple(data.bindAppGuid, data.cfGuid) return { success: true, redirect: true }; } }) @@ -312,9 +298,9 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { updateData ).pipe( map(er => ({ - success: !er.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].error, - redirect: !er.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].error, - message: `Failed to update service instance: ${er.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].message}` + success: !er.error, + redirect: !er.error, + message: `Failed to update service instance: ${er.message}` })) ); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.spec.ts index 9529f0c601..4eacf1721f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-instances/card-app-instances.component.spec.ts @@ -12,15 +12,13 @@ import { import { ApplicationStateComponent, } from '../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; import { CardStatusComponent } from '../../../../../../core/src/shared/components/cards/card-status/card-status.component'; import { ConfirmationDialogService } from '../../../../../../core/src/shared/components/confirmation-dialog.service'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../../../features/applications/application.service'; +import { ApplicationStateService } from '../../../services/application-state.service'; import { RunningInstancesComponent } from '../../running-instances/running-instances.component'; import { CardAppInstancesComponent } from './card-app-instances.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-status/card-app-status.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-status/card-app-status.component.spec.ts index 44a3c70cc5..c3a4e7dc27 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-status/card-app-status.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-status/card-app-status.component.spec.ts @@ -11,7 +11,7 @@ import { ApplicationStateComponent, } from '../../../../../../core/src/shared/components/application-state/application-state.component'; import { CardStatusComponent } from '../../../../../../core/src/shared/components/cards/card-status/card-status.component'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { ApplicationService } from '../../../../features/applications/application.service'; import { CardAppStatusComponent } from './card-app-status.component'; @@ -35,7 +35,7 @@ describe('CardAppStatusComponent', () => { { provide: ApplicationService, useClass: ApplicationServiceMock }, ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-uptime/card-app-uptime.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-uptime/card-app-uptime.component.spec.ts index 2be1fdf89c..654313f9e3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-uptime/card-app-uptime.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-uptime/card-app-uptime.component.spec.ts @@ -12,19 +12,19 @@ import { import { ApplicationStateComponent, } from '../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; import { CardStatusComponent } from '../../../../../../core/src/shared/components/cards/card-status/card-status.component'; +import { + CopyToClipboardComponent, +} from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; import { MetadataItemComponent } from '../../../../../../core/src/shared/components/metadata-item/metadata-item.component'; import { UptimePipe } from '../../../../../../core/src/shared/pipes/uptime.pipe'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationMonitorService } from '../../../../features/applications/application-monitor.service'; import { ApplicationService } from '../../../../features/applications/application.service'; +import { ApplicationStateService } from '../../../services/application-state.service'; import { CardAppStatusComponent } from '../card-app-status/card-app-status.component'; import { CardAppUptimeComponent } from './card-app-uptime.component'; -import { CopyToClipboardComponent } from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; describe('CardAppUptimeComponent', () => { let component: CardAppUptimeComponent; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-usage/card-app-usage.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-usage/card-app-usage.component.spec.ts index 75d5f1f9b2..f0bc17b90a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-usage/card-app-usage.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-app-usage/card-app-usage.component.spec.ts @@ -12,18 +12,16 @@ import { import { ApplicationStateComponent, } from '../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../core/src/shared/components/application-state/application-state.service'; import { CardStatusComponent } from '../../../../../../core/src/shared/components/cards/card-status/card-status.component'; import { TableCellStatusDirective, } from '../../../../../../core/src/shared/components/list/list-table/table-cell-status.directive'; import { PercentagePipe } from '../../../../../../core/src/shared/pipes/percentage.pipe'; -import { ApplicationServiceMock } from '../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationMonitorService } from '../../../../features/applications/application-monitor.service'; import { ApplicationService } from '../../../../features/applications/application.service'; +import { ApplicationStateService } from '../../../services/application-state.service'; import { CardAppStatusComponent } from '../card-app-status/card-app-status.component'; import { CardAppUsageComponent } from './card-app-usage.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-info/card-cf-info.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-info/card-cf-info.component.ts index 86c6126adc..503ac52c40 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-info/card-cf-info.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-info/card-cf-info.component.ts @@ -1,17 +1,20 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { ICfV2Info } from 'frontend/packages/core/src/core/cf-api.types'; import { APIResource, EntityInfo } from 'frontend/packages/store/src/types/api.types'; import { Observable, Subscription } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { fetchAutoscalerInfo } from '../../../../../../cf-autoscaler/src/core/autoscaler-helpers/autoscaler-available'; import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; +import { ICfV2Info } from '../../../../cf-api.types'; import { CloudFoundryEndpointService } from '../../../../features/cloud-foundry/services/cloud-foundry-endpoint.service'; import { UserInviteConfigurationDialogComponent, } from '../../../../features/cloud-foundry/user-invites/configuration-dialog/user-invite-configuration-dialog.component'; -import { UserInviteService } from '../../../../features/cloud-foundry/user-invites/user-invite.service'; +import { + UserInviteConfigureService, + UserInviteService, +} from '../../../../features/cloud-foundry/user-invites/user-invite.service'; @Component({ @@ -27,6 +30,7 @@ export class CardCfInfoComponent implements OnInit, OnDestroy { constructor( public cfEndpointService: CloudFoundryEndpointService, public userInviteService: UserInviteService, + public userInviteConfigureService: UserInviteConfigureService, private dialog: MatDialog, private esf: EntityServiceFactory ) { } @@ -72,9 +76,6 @@ export class CardCfInfoComponent implements OnInit, OnDestroy { if (metadata.description) { return metadata.description + (metadata.build ? ` (${metadata.build})` : ''); } - if (metadata.support === 'pcfdev@pivotal.io') { - return 'PCF Dev'; - } } return '-'; } @@ -88,6 +89,6 @@ export class CardCfInfoComponent implements OnInit, OnDestroy { } deConfigureUserInvites() { - this.userInviteService.unconfigure(this.cfEndpointService.cfGuid); + this.userInviteConfigureService.unconfigure(this.cfEndpointService.cfGuid); } } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component.spec.ts index 0a217fd438..7b9e5540dd 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-org-user-details/card-cf-org-user-details.component.spec.ts @@ -1,27 +1,27 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { BooleanIndicatorComponent, } from '../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { + CopyToClipboardComponent, +} from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; import { MetadataItemComponent } from '../../../../../../core/src/shared/components/metadata-item/metadata-item.component'; +import { CapitalizeFirstPipe } from '../../../../../../core/src/shared/pipes/capitalizeFirstLetter.pipe'; +import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { CapitalizeFirstPipe } from '../../../../../../core/src/shared/pipes/capitalizeFirstLetter.pipe'; import { generateCfBaseTestModulesNoShared, generateTestCfEndpointServiceProvider, } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { - CloudFoundryOrganizationServiceMock, -} from '../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; +import { CloudFoundryOrganizationServiceMock } from '../../../../../test-framework/cloud-foundry-organization.service.mock'; import { CloudFoundryOrganizationService, } from '../../../../features/cloud-foundry/services/cloud-foundry-organization.service'; import { CfOrgSpaceDataService } from '../../../data-services/cf-org-space-service.service'; import { CfUserService } from '../../../data-services/cf-user.service'; import { CardCfOrgUserDetailsComponent } from './card-cf-org-user-details.component'; -import { CopyToClipboardComponent } from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; describe('CardCfOrgUserDetailsComponent', () => { let component: CardCfOrgUserDetailsComponent; 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 index 147e03657b..6edd6010ab 100644 --- 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 @@ -8,11 +8,9 @@ import { appDataSort, CloudFoundryEndpointService, } from '../../../../../../cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service'; -import { IApp } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { appStatsEntityType } from '../../../../cf-entity-types'; +import { IApp } from '../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; const RECENT_ITEMS_COUNT = 10; @@ -45,10 +43,7 @@ export class CardCfRecentAppsComponent implements OnInit { private fetchAppStats(recentApps: APIResource[]) { recentApps.forEach(app => { if (app.entity.state === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(app.metadata.guid, this.cfEndpointService.cfGuid); - this.store.dispatch(getAppStatsAction); + cfEntityCatalog.appStats.api.getMultiple(app.metadata.guid, this.cfEndpointService.cfGuid); } }); } 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/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts index d706c20216..8054860739 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/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.spec.ts @@ -6,13 +6,9 @@ import { import { ApplicationStateIconPipe, } from '../../../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.pipe'; -import { - ApplicationStateService, -} from '../../../../../../../core/src/shared/components/application-state/application-state.service'; -import { - generateCfBaseTestModulesNoShared, -} from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateCfBaseTestModulesNoShared } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; +import { ApplicationStateService } from '../../../../services/application-state.service'; 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/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts index 6006ee7bc3..a6c13b1af5 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/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts @@ -6,12 +6,9 @@ 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 { ActiveRouteCfOrgSpace } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { - ApplicationStateData, - ApplicationStateService, -} from '../../../../../../../core/src/shared/components/application-state/application-state.service'; import { BREADCRUMB_URL_PARAM } from '../../../../../../../core/src/shared/components/breadcrumbs/breadcrumbs.types'; import { StratosStatus } from '../../../../../../../core/src/shared/shared.types'; +import { ApplicationStateData, ApplicationStateService } from '../../../../services/application-state.service'; @Component({ @@ -41,7 +38,6 @@ export class CompactAppCardComponent implements OnInit { this.bcType = this.setBreadcrumbType(this.activeRouteCfOrgSpace); const initState = this.appStateService.get(this.app.entity, null); this.applicationState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.app.entity, this.app.metadata.guid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.spec.ts index 09b1e0b5a0..11aadb41a3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-space-details/card-cf-space-details.component.spec.ts @@ -3,15 +3,15 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BooleanIndicatorComponent, } from '../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { + CopyToClipboardComponent, +} from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; import { MetadataItemComponent } from '../../../../../../core/src/shared/components/metadata-item/metadata-item.component'; import { EntityMonitorFactory } from '../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { - generateCfBaseTestModulesNoShared, -} from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { generateCfBaseTestModulesNoShared } from '../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CloudFoundrySpaceServiceMock } from '../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { CardCfSpaceDetailsComponent } from './card-cf-space-details.component'; -import { CopyToClipboardComponent } from '../../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; describe('CardCfSpaceDetailsComponent', () => { let component: CardCfSpaceDetailsComponent; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/compact-service-instance-card/compact-service-instance-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/compact-service-instance-card/compact-service-instance-card.component.ts index 1b7b16622d..ad2b3f68fa 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/compact-service-instance-card/compact-service-instance-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/compact-service-instance-card/compact-service-instance-card.component.ts @@ -1,8 +1,8 @@ import { Component, Input, OnInit } from '@angular/core'; -import { IServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../core/src/shared/components/chips/chips.component'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../cf-api-svc.types'; @Component({ selector: 'app-compact-service-instance-card', 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 079ba90a05..de72d19887 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 @@ -1,18 +1,12 @@ import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, switchMap, take, tap } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { ServicesService } from '../../../../../../cloud-foundry/src/features/service-catalog/services.service'; -import { IServiceBroker } from '../../../../../../core/src/core/cf-api-svc.types'; -import { ISpace } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { spaceEntityType } from '../../../../cf-entity-types'; +import { IServiceBroker } from '../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; @Component({ selector: 'app-service-broker-card', @@ -27,9 +21,7 @@ export class ServiceBrokerCardComponent implements OnDestroy { subs: Subscription[] = []; constructor( - private servicesService: ServicesService, - private store: Store, - private entityServiceFactory: EntityServiceFactory + private servicesService: ServicesService ) { this.serviceBroker$ = this.servicesService.serviceBroker$; this.subs.push(this.serviceBroker$.pipe( @@ -39,14 +31,7 @@ export class ServiceBrokerCardComponent implements OnDestroy { filter(o => !!o), // Broker is space scoped switchMap(spaceGuid => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(spaceGuid, this.servicesService.cfGuid); - const spaceService = this.entityServiceFactory.create>( - spaceGuid, - getSpaceAction - ); - return spaceService.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/cards/service-recent-instances-card/service-recent-instances-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-recent-instances-card/service-recent-instances-card.component.ts index 5e6b407498..f84441a6ae 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-recent-instances-card/service-recent-instances-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-recent-instances-card/service-recent-instances-card.component.ts @@ -3,8 +3,8 @@ import { Observable } from 'rxjs'; import { first, map } from 'rxjs/operators'; import { ServicesService } from '../../../../../../cloud-foundry/src/features/service-catalog/services.service'; -import { IServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../cf-api-svc.types'; const RECENT_ITEMS_COUNT = 10; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-summary-card/service-summary-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-summary-card/service-summary-card.component.ts index d08a01d6d9..27d2a27587 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-summary-card/service-summary-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-summary-card/service-summary-card.component.ts @@ -6,9 +6,9 @@ import { ServicesService } from '../../../../../../cloud-foundry/src/features/se import { ServiceTag, } from '../../../../../../cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component'; -import { IService } from '../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../core/src/shared/components/chips/chips.component'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { IService } from '../../../../cf-api-svc.types'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.spec.ts index f9c13ac18a..dc3c440bff 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.spec.ts @@ -2,8 +2,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { of } from 'rxjs'; -import { CfOrgSpaceLabelService } from '../../../../../core/src/shared/services/cf-org-space-label.service'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfOrgSpaceLabelService } from '../../services/cf-org-space-label.service'; import { CfOrgSpaceLinksComponent } from './cf-org-space-links.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.ts index 23262a6a8d..e8e0b8bbe0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -import { CfOrgSpaceLabelService } from '../../../../../core/src/shared/services/cf-org-space-label.service'; +import { CfOrgSpaceLabelService } from '../../services/cf-org-space-label.service'; @Component({ selector: 'app-cf-org-space-links', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cf-role-checkbox/cf-role-checkbox.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cf-role-checkbox/cf-role-checkbox.component.spec.ts index d47b10ad55..a1620f3c8e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cf-role-checkbox/cf-role-checkbox.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cf-role-checkbox/cf-role-checkbox.component.spec.ts @@ -1,3 +1,4 @@ +import { HttpClientModule } from '@angular/common/http'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -5,11 +6,10 @@ import { CoreModule } from '../../../../../core/src/core/core.module'; import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfStoreModules } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfUserServiceTestProvider } from '../../../../../core/test-framework/user-service-helper'; +import { CfUserServiceTestProvider } from '../../../../test-framework/user-service-helper'; import { ActiveRouteCfOrgSpace } from '../../../features/cloud-foundry/cf-page.types'; import { CfRolesService } from '../../../features/cloud-foundry/users/manage-users/cf-roles.service'; import { CfRoleCheckboxComponent } from './cf-role-checkbox.component'; -import { HttpClientModule } from '@angular/common/http'; describe('CfRoleCheckboxComponent', () => { let component: CfRoleCheckboxComponent; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cloud-foundry-events-list/cloud-foundry-events-list.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cloud-foundry-events-list/cloud-foundry-events-list.component.spec.ts index 7efdde624a..90b3c30f3f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cloud-foundry-events-list/cloud-foundry-events-list.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cloud-foundry-events-list/cloud-foundry-events-list.component.spec.ts @@ -22,8 +22,14 @@ describe('CloudFoundryEventsListComponent', () => { provide: ListConfig, useClass: CfAllEventsConfigService, }, - CloudFoundryEndpointService, - ActiveRouteCfOrgSpace, + CloudFoundryEndpointService, { + provide: ActiveRouteCfOrgSpace, + useValue: { + cfGuid: 'cfGuid', + orgGuid: 'orgGuid', + spaceGuid: 'spaceGuid' + } + }, CfUserService ] }) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts b/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts deleted file mode 100644 index 0eab5d7bd5..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/components.module.ts +++ /dev/null @@ -1,340 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { ApplicationModule, NgModule, Type } from '@angular/core'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; - -import { CoreModule } from '../../../../core/src/core/core.module'; -import { - TableCellQuotaComponent, -} from '../../../../core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component'; -import { - TableCellServiceLastOpComponent, -} from '../../../../core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component'; -import { - TableCellServiceComponent, -} from '../../../../core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component'; -import { CardCell, TableCellCustom } from '../../../../core/src/shared/components/list/list.types'; -import { - ServiceInstanceLastOpComponent, -} from '../../../../core/src/shared/components/service-instance-last-op/service-instance-last-op.component'; -import { SharedModule } from '../../../../core/src/shared/shared.module'; -import { - AddServiceInstanceBaseStepComponent, -} from './add-service-instance/add-service-instance-base-step/add-service-instance-base-step.component'; -import { AddServiceInstanceComponent } from './add-service-instance/add-service-instance/add-service-instance.component'; -import { BindAppsStepComponent } from './add-service-instance/bind-apps-step/bind-apps-step.component'; -import { NoServicePlansComponent } from './add-service-instance/no-service-plans/no-service-plans.component'; -import { SelectPlanStepComponent } from './add-service-instance/select-plan-step/select-plan-step.component'; -import { SpecifyDetailsStepComponent } from './add-service-instance/specify-details-step/specify-details-step.component'; -import { - SpecifyUserProvidedDetailsComponent, -} from './add-service-instance/specify-user-provided-details/specify-user-provided-details.component'; -import { CardAppInstancesComponent } from './cards/card-app-instances/card-app-instances.component'; -import { CardAppStatusComponent } from './cards/card-app-status/card-app-status.component'; -import { CardAppUptimeComponent } from './cards/card-app-uptime/card-app-uptime.component'; -import { CardAppUsageComponent } from './cards/card-app-usage/card-app-usage.component'; -import { CardCfInfoComponent } from './cards/card-cf-info/card-cf-info.component'; -import { CardCfOrgUserDetailsComponent } from './cards/card-cf-org-user-details/card-cf-org-user-details.component'; -import { CardCfRecentAppsComponent } from './cards/card-cf-recent-apps/card-cf-recent-apps.component'; -import { CompactAppCardComponent } from './cards/card-cf-recent-apps/compact-app-card/compact-app-card.component'; -import { CardCfSpaceDetailsComponent } from './cards/card-cf-space-details/card-cf-space-details.component'; -import { CardCfUserInfoComponent } from './cards/card-cf-user-info/card-cf-user-info.component'; -import { - CompactServiceInstanceCardComponent, -} from './cards/compact-service-instance-card/compact-service-instance-card.component'; -import { ServiceBrokerCardComponent } from './cards/service-broker-card/service-broker-card.component'; -import { - ServiceRecentInstancesCardComponent, -} from './cards/service-recent-instances-card/service-recent-instances-card.component'; -import { ServiceSummaryCardComponent } from './cards/service-summary-card/service-summary-card.component'; -import { CfEndpointDetailsComponent } from './cf-endpoint-details/cf-endpoint-details.component'; -import { CfEndpointsMissingComponent } from './cf-endpoints-missing/cf-endpoints-missing.component'; -import { CfOrgSpaceLinksComponent } from './cf-org-space-links/cf-org-space-links.component'; -import { CfRoleCheckboxComponent } from './cf-role-checkbox/cf-role-checkbox.component'; -import { CliCommandComponent } from './cli-info/cli-command/cli-command.component'; -import { CliInfoComponent } from './cli-info/cli-info.component'; -import { CloudFoundryEventsListComponent } from './cloud-foundry-events-list/cloud-foundry-events-list.component'; -import { - CreateApplicationStep1Component, -} from './create-application/create-application-step1/create-application-step1.component'; -import { TableCellCfCellComponent } from './list/list-types/app-instance/table-cell-cf-cell/table-cell-cf-cell.component'; -import { TableCellUsageComponent } from './list/list-types/app-instance/table-cell-usage/table-cell-usage.component'; -import { - AppServiceBindingCardComponent, -} from './list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component'; -import { - TableCellEditVariableComponent, -} from './list/list-types/app-variables/table-cell-edit-variable/table-cell-edit-variable.component'; -import { CardAppComponent } from './list/list-types/app/card/card-app.component'; -import { - TableCellAppCfOrgSpaceHeaderComponent, -} from './list/list-types/app/table-cell-app-cforgspace-header/table-cell-app-cforgspace-header.component'; -import { - TableCellAppCfOrgSpaceComponent, -} from './list/list-types/app/table-cell-app-cforgspace/table-cell-app-cforgspace.component'; -import { - TableCellAppInstancesComponent, -} from './list/list-types/app/table-cell-app-instances/table-cell-app-instances.component'; -import { TableCellAppNameComponent } from './list/list-types/app/table-cell-app-name/table-cell-app-name.component'; -import { TableCellAppStatusComponent } from './list/list-types/app/table-cell-app-status/table-cell-app-status.component'; -import { CfBuildpackCardComponent } from './list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component'; -import { - TableCellConfirmOrgSpaceComponent, -} from './list/list-types/cf-confirm-roles/table-cell-confirm-org-space/table-cell-confirm-org-space.component'; -import { - TableCellConfirmRoleAddRemComponent, -} from './list/list-types/cf-confirm-roles/table-cell-confirm-role-add-rem/table-cell-confirm-role-add-rem.component'; -import { EventMetadataComponent } from './list/list-types/cf-events/event-metadata/event-metadata.component'; -import { - TableCellEventActeeComponent, -} from './list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component'; -import { EventTabActorIconPipe } from './list/list-types/cf-events/table-cell-event-action/event-tab-actor-icon.pipe'; -import { - TableCellEventActionComponent, -} from './list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component'; -import { - TableCellEventDetailComponent, -} from './list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component'; -import { - TableCellEventTimestampComponent, -} from './list/list-types/cf-events/table-cell-event-timestamp/table-cell-event-timestamp.component'; -import { - TableCellEventTypeComponent, -} from './list/list-types/cf-events/table-cell-event-type/table-cell-event-type.component'; -import { - TableCellFeatureFlagDescriptionComponent, -} from './list/list-types/cf-feature-flags/table-cell-feature-flag-description/table-cell-feature-flag-description.component'; -import { - TableCellFeatureFlagStateComponent, -} from './list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component'; -import { CfOrgCardComponent } from './list/list-types/cf-orgs/cf-org-card/cf-org-card.component'; -import { - TableCellRouteAppsAttachedComponent, -} from './list/list-types/cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component'; -import { TableCellRouteComponent } from './list/list-types/cf-routes/table-cell-route/table-cell-route.component'; -import { TableCellTCPRouteComponent } from './list/list-types/cf-routes/table-cell-tcproute/table-cell-tcproute.component'; -import { - CfSecurityGroupsCardComponent, -} from './list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component'; -import { CfServiceCardComponent } from './list/list-types/cf-services/cf-service-card/cf-service-card.component'; -import { - TableCellServiceActiveComponent, -} from './list/list-types/cf-services/table-cell-service-active/table-cell-service-active.component'; -import { - TableCellServiceBindableComponent, -} from './list/list-types/cf-services/table-cell-service-bindable/table-cell-service-bindable.component'; -import { - TableCellServiceCfBreadcrumbsComponent, -} from './list/list-types/cf-services/table-cell-service-cf-breadcrumbs/table-cell-service-cf-breadcrumbs.component'; -import { - TableCellServiceProviderComponent, -} from './list/list-types/cf-services/table-cell-service-provider/table-cell-service-provider.component'; -import { - TableCellServiceReferencesComponent, -} from './list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component'; -import { - TableCellServiceTagsComponent, -} from './list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component'; -import { - TableCellServiceInstanceAppsAttachedComponent, -} from './list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component'; -import { - TableCellServiceInstanceTagsComponent, -} from './list/list-types/cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component'; -import { - TableCellSpaceNameComponent, -} from './list/list-types/cf-spaces-service-instances/table-cell-space-name/table-cell-space-name.component'; -import { CfSpaceCardComponent } from './list/list-types/cf-spaces/cf-space-card/cf-space-card.component'; -import { CfStacksCardComponent } from './list/list-types/cf-stacks/cf-stacks-card/cf-stacks-card.component'; -import { - TableCellRoleOrgSpaceComponent, -} from './list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component'; -import { - TableCellSelectOrgComponent, -} from './list/list-types/cf-users-org-space-roles/table-cell-select-org/table-cell-select-org.component'; -import { - CfOrgPermissionCellComponent, -} from './list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component'; -import { - CfSpacePermissionCellComponent, -} from './list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component'; -import { - TableCellAServicePlanExtrasComponent, -} from './list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component'; -import { - TableCellAServicePlanPriceComponent, -} from './list/list-types/service-plans/table-cell-service-plan-price/table-cell-service-plan-price.component'; -import { - TableCellAServicePlanPublicComponent, -} from './list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component'; -import { - ServiceInstanceCardComponent, -} from './list/list-types/services-wall/service-instance-card/service-instance-card.component'; -import { - UserProvidedServiceInstanceCardComponent, -} from './list/list-types/services-wall/user-provided-service-instance-card/user-provided-service-instance-card.component'; -import { RunningInstancesComponent } from './running-instances/running-instances.component'; -import { SchemaFormComponent } from './schema-form/schema-form.component'; -import { SelectServiceComponent } from './select-service/select-service.component'; -import { ServiceIconComponent } from './service-icon/service-icon.component'; -import { ServicePlanPriceComponent } from './service-plan-price/service-plan-price.component'; -import { ServicePlanPublicComponent } from './service-plan-public/service-plan-public.component'; - -// tslint:disable:max-line-length -// tslint:enable:max-line-length - -const cfListTableCells: Type>[] = [ - TableCellServiceInstanceAppsAttachedComponent, - TableCellServiceComponent, - TableCellServiceLastOpComponent, - TableCellRouteAppsAttachedComponent, - CfOrgPermissionCellComponent, - CfSpacePermissionCellComponent, - TableCellFeatureFlagStateComponent, - TableCellFeatureFlagDescriptionComponent, - TableCellConfirmOrgSpaceComponent, - TableCellSelectOrgComponent, - TableCellAppStatusComponent, - TableCellRoleOrgSpaceComponent, - TableCellConfirmRoleAddRemComponent, - TableCellSpaceNameComponent, - TableCellAppCfOrgSpaceHeaderComponent, - TableCellAppCfOrgSpaceComponent, - TableCellAServicePlanPublicComponent, - TableCellAServicePlanPriceComponent, - TableCellAServicePlanExtrasComponent, - TableCellCfCellComponent, - TableCellRouteComponent, - TableCellTCPRouteComponent, - TableCellAppInstancesComponent, - TableCellAppNameComponent, - TableCellEditVariableComponent, - TableCellEventTimestampComponent, - TableCellEventTypeComponent, - TableCellEventActionComponent, - TableCellEventDetailComponent, - TableCellUsageComponent, - TableCellQuotaComponent, - TableCellEventActeeComponent, - TableCellServiceTagsComponent, - TableCellServiceCfBreadcrumbsComponent, - TableCellServiceProviderComponent, - TableCellServiceBindableComponent, - TableCellServiceActiveComponent, - TableCellServiceReferencesComponent, - TableCellServiceInstanceTagsComponent, -]; - -const cfListCards: Type>[] = [ - AppServiceBindingCardComponent, - CardAppComponent, - CfOrgCardComponent, - CfSpaceCardComponent, - CfBuildpackCardComponent, - CfSecurityGroupsCardComponent, - CfStacksCardComponent, - CfServiceCardComponent, - ServiceInstanceCardComponent, - UserProvidedServiceInstanceCardComponent, -]; - -// listTableCells.push(); - -@NgModule({ - imports: [ - CommonModule, - CoreModule, - SharedModule, - ApplicationModule, - MaterialDesignFrameworkModule, - ], - declarations: [ - ServiceIconComponent, - CfEndpointDetailsComponent, - CliCommandComponent, - CliInfoComponent, - CfEndpointsMissingComponent, - CfRoleCheckboxComponent, - CfOrgSpaceLinksComponent, - SelectServiceComponent, - SpecifyDetailsStepComponent, - AddServiceInstanceComponent, - SelectPlanStepComponent, - NoServicePlansComponent, - BindAppsStepComponent, - SpecifyUserProvidedDetailsComponent, - AddServiceInstanceBaseStepComponent, - SchemaFormComponent, - CardAppStatusComponent, - CardAppInstancesComponent, - CardAppUsageComponent, - CardAppUptimeComponent, - CardCfInfoComponent, - CardCfUserInfoComponent, - CardCfOrgUserDetailsComponent, - CardCfSpaceDetailsComponent, - CardCfRecentAppsComponent, - CompactAppCardComponent, - ServiceSummaryCardComponent, - ServiceBrokerCardComponent, - ServiceRecentInstancesCardComponent, - CompactServiceInstanceCardComponent, - RunningInstancesComponent, - ServicePlanPublicComponent, - ServicePlanPriceComponent, - CreateApplicationStep1Component, - EventTabActorIconPipe, - CloudFoundryEventsListComponent, - EventMetadataComponent, - ...cfListTableCells, - ...cfListCards, - ServiceInstanceLastOpComponent, - TableCellFeatureFlagDescriptionComponent - ], - exports: [ - ServiceIconComponent, - CfEndpointDetailsComponent, - CliCommandComponent, - CliInfoComponent, - CfEndpointsMissingComponent, - CfRoleCheckboxComponent, - CfOrgSpaceLinksComponent, - SelectServiceComponent, - SpecifyDetailsStepComponent, - AddServiceInstanceComponent, - SelectPlanStepComponent, - NoServicePlansComponent, - BindAppsStepComponent, - SpecifyUserProvidedDetailsComponent, - AddServiceInstanceBaseStepComponent, - CfServiceCardComponent, - SchemaFormComponent, - CardAppStatusComponent, - CardAppInstancesComponent, - CardAppUsageComponent, - CardAppUptimeComponent, - CardCfInfoComponent, - CardCfUserInfoComponent, - CardCfOrgUserDetailsComponent, - CardCfSpaceDetailsComponent, - CardCfRecentAppsComponent, - CompactAppCardComponent, - ServiceSummaryCardComponent, - ServiceBrokerCardComponent, - ServiceRecentInstancesCardComponent, - CompactServiceInstanceCardComponent, - RunningInstancesComponent, - ServicePlanPublicComponent, - ServicePlanPriceComponent, - CreateApplicationStep1Component, - CloudFoundryEventsListComponent - ], - entryComponents: [ - CfEndpointDetailsComponent, - NoServicePlansComponent, - EventMetadataComponent, - - ...cfListTableCells, - ...cfListCards - ] -}) -export class CloudFoundryComponentsModule { } 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 a949b6f8d0..e455fddee4 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 @@ -5,10 +5,10 @@ import { Store } from '@ngrx/store'; import { asapScheduler, Observable, of } from 'rxjs'; import { map, observeOn, startWith, switchMap, withLatestFrom } from 'rxjs/operators'; -import { ISpace } from '../../../../../../core/src/core/cf-api.types'; import { PermissionStrings } from '../../../../../../core/src/core/current-user-permissions.config'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { SetCFDetails } from '../../../../actions/create-applications-page.actions'; +import { ISpace } from '../../../../cf-api.types'; import { CFAppState } from '../../../../cf-app-state'; import { getSpacesFromOrgWithRole } from '../../../../store/selectors/cf-current-user-role.selectors'; import { CfOrgSpaceDataService } from '../../../data-services/cf-org-space-service.service'; diff --git a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.html diff --git a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.scss diff --git a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.spec.ts similarity index 74% rename from src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.spec.ts index 517a74b7ae..0047f9b5bb 100644 --- a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.spec.ts @@ -1,9 +1,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { BaseTestModulesNoShared } from '../../../../test-framework/core-test.helper'; -import { CodeBlockComponent } from '../code-block/code-block.component'; -import { CopyToClipboardComponent } from '../copy-to-clipboard/copy-to-clipboard.component'; +import { CodeBlockComponent } from '../../../../../core/src/shared/components/code-block/code-block.component'; +import { + CopyToClipboardComponent, +} from '../../../../../core/src/shared/components/copy-to-clipboard/copy-to-clipboard.component'; +import { BaseTestModulesNoShared } from '../../../../../core/test-framework/core-test.helper'; import { EnvVarViewComponent } from './env-var-view.component'; describe('EnvVarViewComponent', () => { diff --git a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.ts similarity index 87% rename from src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.ts index 2037ff0df5..d8fd1aa334 100644 --- a/src/frontend/packages/core/src/shared/components/env-var-view/env-var-view.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/env-var-view/env-var-view.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; diff --git a/src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.html diff --git a/src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.scss diff --git a/src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.spec.ts similarity index 100% rename from src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.spec.ts diff --git a/src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.ts similarity index 79% rename from src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.ts index 00a89fc8c5..359e35c1e2 100644 --- a/src/frontend/packages/core/src/shared/components/github-commit-author/github-commit-author.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/github-commit-author/github-commit-author.component.ts @@ -1,5 +1,6 @@ import { Component, Input } from '@angular/core'; -import { GitCommit } from '../../../../../cloud-foundry/src/store/types/git.types'; + +import { GitCommit } from '../../../store/types/git.types'; @Component({ selector: 'app-github-commit-author', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.spec.ts index 55ce1e5919..d015f401ca 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service.spec.ts @@ -1,13 +1,13 @@ import { CommonModule } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; +import { testSCFEndpointGuid } from '@stratos/store/testing'; import { CoreModule } from '../../../../../../../core/src/core/core.module'; import { CF_GUID } from '../../../../../../../core/src/shared/entity.tokens'; import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; -import { generateTestApplicationServiceProvider } from '../../../../../../../core/test-framework/application-service-helper'; import { generateTestEntityServiceProvider } from '../../../../../../../core/test-framework/entity-service.helper'; -import { testSCFEndpointGuid } from '@stratos/store/testing'; +import { generateTestApplicationServiceProvider } from '../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules, generateTestCfEndpointServiceProvider, 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 c4f09cb617..1559dfec06 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 @@ -8,14 +8,17 @@ import { DeleteApplicationInstance } from '../../../../../../../cloud-foundry/sr import { FetchApplicationMetricsAction } from '../../../../../../../cloud-foundry/src/actions/cf-metrics.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { UtilsService } from '../../../../../../../core/src/core/utils.service'; -import { CfCellHelper } from '../../../../../../../core/src/features/cloud-foundry/cf-cell.helpers'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { getIntegerFieldSortFunction, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/local-filtering-sorting'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; -import { IListAction, IListConfig, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; +import { + IListAction, + IListConfig, + ListViewTypes, +} from '../../../../../../../core/src/shared/components/list/list.component.types'; import { MetricQueryType } from '../../../../../../../core/src/shared/services/metrics-range-selector.types'; import { MetricQueryConfig } from '../../../../../../../store/src/actions/metrics.actions'; import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; @@ -23,12 +26,12 @@ import { PaginationMonitorFactory } from '../../../../../../../store/src/monitor import { IMetricMatrixResult, IMetrics } from '../../../../../../../store/src/types/base-metric.types'; import { IMetricApplication } from '../../../../../../../store/src/types/metric.types'; import { ApplicationService } from '../../../../../features/applications/application.service'; +import { CfCellHelper } from '../../../../../features/cloud-foundry/cf-cell.helpers'; import { ListAppInstance } from './app-instance-types'; import { CfAppInstancesDataSource } from './cf-app-instances-data-source'; import { TableCellCfCellComponent } from './table-cell-cf-cell/table-cell-cf-cell.component'; import { TableCellUsageComponent } from './table-cell-usage/table-cell-usage.component'; -// TODO: Move file to CF package (#3769) export function createAppInstancesMetricAction(appGuid: string, cfGuid: string): FetchApplicationMetricsAction { return new FetchApplicationMetricsAction( appGuid, 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 f7832d76a6..3976e36dc2 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 @@ -2,14 +2,12 @@ import { Store } from '@ngrx/store'; import { map } from 'rxjs/operators'; import { AppStat } from '../../../../../../../cloud-foundry/src/store/types/app-metadata.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { applicationEntityType, appStatsEntityType } from '../../../../../cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../../entity-relations/entity-relations.types'; @@ -24,9 +22,7 @@ export class CfAppInstancesDataSource extends ListDataSource ) { const paginationKey = createEntityRelationPaginationKey(applicationEntityType, appGuid); - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(appGuid, cfGuid) as PaginatedAction; + const action = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid) super( { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.spec.ts index 30c29cf8e4..1c3df42e10 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.spec.ts @@ -5,7 +5,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CoreModule } from '../../../../../../../core/src/core/core.module'; import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfAppMapRoutesListConfigService } from './cf-app-map-routes-list-config.service'; 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 c133b21cca..a07393539f 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 @@ -3,21 +3,19 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { GetSpaceRoutes } from '../../../../../../../cloud-foundry/src/actions/space.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType, spaceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; +import { spaceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { TableCellRadioComponent, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfAppRoutesListConfigServiceBase } from './cf-app-routes-list-config-base'; @@ -33,13 +31,11 @@ export class CfAppMapRoutesListConfigService extends CfAppRoutesListConfigServic currentUserPermissionsService: CurrentUserPermissionsService, ) { const spaceGuid = activatedRoute.snapshot.queryParamMap.get('spaceGuid'); - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder( + const action = cfEntityCatalog.route.actions.getAllInSpace( spaceGuid, appService.cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid) - ) as GetSpaceRoutes; + ) // 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-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-data-source.ts index f66e3556dd..130a5a454c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-data-source.ts @@ -1,13 +1,13 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; import { IListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { IRoute } from '../../../../../cf-api.types'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfRoutesDataSourceBase } from '../cf-routes/cf-routes-data-source-base'; 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 7c4e0decb6..2f970c7cfa 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 @@ -3,17 +3,15 @@ import { Store } from '@ngrx/store'; import { of as observableOf } from 'rxjs'; import { publishReplay, refCount, switchMap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { GetAppRoutes } from '../../../../../../../cloud-foundry/src/actions/application-service-routes.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfRoutesListConfigBase } from '../cf-routes/cf-routes-list-config-base'; import { CfAppRoutesDataSource } from './cf-app-routes-data-source'; @@ -64,9 +62,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 routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppRoutesAction = actionBuilder(appService.appGuid, appService.cfGuid) as PaginatedAction; + 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-route/cf-app-routes-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.spec.ts index 55b1bafe3e..3094755217 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config.service.spec.ts @@ -7,7 +7,7 @@ import { CoreModule } from '../../../../../../../core/src/core/core.module'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; -import { ApplicationServiceMock } from '../../../../../../../core/test-framework/application-service-helper'; +import { ApplicationServiceMock } from '../../../../../../test-framework/application-service-helper'; import { generateCfStoreModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CFAppState } from '../../../../../cf-app-state'; import { ApplicationService } from '../../../../../features/applications/application.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.spec.ts index a750364c56..c92ca3f71b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.spec.ts @@ -1,24 +1,18 @@ import { DatePipe } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { - generateTestApplicationServiceProvider, -} from '../../../../../../../../core/test-framework/application-service-helper'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { generateTestApplicationServiceProvider } from '../../../../../../../test-framework/application-service-helper'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; import { ApplicationEnvVarsHelper, } from '../../../../../../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; +import { ApplicationStateService } from '../../../../../services/application-state.service'; import { CfOrgSpaceLinksComponent } from '../../../../cf-org-space-links/cf-org-space-links.component'; import { ServiceIconComponent } from '../../../../service-icon/service-icon.component'; import { AppServiceBindingCardComponent } from './app-service-binding-card.component'; @@ -55,7 +49,7 @@ describe('AppServiceBindingCardComponent', () => { component.row = { entity: { app_guid: '', - service_instance_guid: '', + service_instance_guid: 'service_instance_guid', credentials: {}, binding_options: {}, gateway_name: '', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts index 671f85f971..f3219c6d18 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts @@ -4,35 +4,27 @@ import { MatDialog } from '@angular/material/dialog'; import { combineLatest as observableCombineLatest, Observable, of as observableOf, of } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { - IService, - IServiceBinding, - IServiceInstance, - IUserProvidedServiceInstance, -} from '../../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; -import { EnvVarViewComponent } from '../../../../../../../../core/src/shared/components/env-var-view/env-var-view.component'; import { MetaCardMenuItem, } from '../../../../../../../../core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component'; import { CardCell, IListRowCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { ComponentEntityMonitorConfig } from '../../../../../../../../core/src/shared/shared.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource, EntityInfo } from '../../../../../../../../store/src/types/api.types'; -import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { - serviceBindingEntityType, - serviceInstancesEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; + IService, + IServiceBinding, + IServiceInstance, + IUserProvidedServiceInstance, +} from '../../../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; +import { cfEntityFactory } from '../../../../../../cf-entity-factory'; +import { serviceBindingEntityType } from '../../../../../../cf-entity-types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; import { isUserProvidedServiceInstance } from '../../../../../../features/cloud-foundry/cf.helpers'; import { - getCfService, getServiceBrokerName, getServiceName, getServicePlanName, @@ -40,6 +32,7 @@ import { } from '../../../../../../features/service-catalog/services-helper'; import { AppEnvVarsState } from '../../../../../../store/types/app-metadata.types'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; +import { EnvVarViewComponent } from '../../../../env-var-view/env-var-view.component'; interface EnvVarData { @@ -73,7 +66,6 @@ export class AppServiceBindingCardComponent extends CardCell>( - this.row.entity.service_instance_guid, - getServiceInstanceAction + const serviceInstance$ = cfEntityCatalog.serviceInstance.store.getEntityService( + this.row.entity.service_instance_guid, this.appService.cfGuid ).waitForEntity$; this.serviceInstance$ = serviceInstance$; this.service$ = serviceInstance$.pipe( - switchMap(o => getCfService(o.entity.entity.service_guid, this.appService.cfGuid, this.entityServiceFactory).waitForEntity$), + switchMap(o => cfEntityCatalog.service.store.getEntityService(o.entity.entity.service_guid, this.appService.cfGuid, {}) + .waitForEntity$), filter(service => !!service) ); this.listData = [{ @@ -163,7 +152,6 @@ export class AppServiceBindingCardComponent extends CardCell>( - this.row.entity.service_instance_guid, - getUserProvidedServiceAction + const userProvidedServiceInstance$ = cfEntityCatalog.userProvidedService.store.getEntityService( + this.row.entity.service_instance_guid, this.appService.cfGuid ).waitForEntity$; this.serviceInstance$ = userProvidedServiceInstance$; this.service$ = of(null); @@ -252,7 +236,7 @@ export class AppServiceBindingCardComponent extends CardCell this.serviceActionHelperService.editServiceBinding( + private edit = () => this.serviceActionHelperService.startEditServiceBindingStepper( this.row.entity.service_instance_guid, this.appService.cfGuid, { appId: this.appService.appGuid }, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts index 6b324918a8..236f9e6abd 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -13,26 +14,20 @@ import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; -import { getRowMetadata } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { IServiceBinding } from '../../../../../../../core/src/core/cf-api-svc.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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceBindingActionBuilders } from '../../../../../entity-action-builders/service-binding.action-builders'; export class AppServiceBindingDataSource extends ListDataSource> { static createGetAllServiceBindings(appGuid: string, cfGuid: string) { + const paginationKey = createEntityRelationPaginationKey(serviceBindingEntityType, appGuid); - const serviceBindingEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = serviceBindingEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppServiceBindingsAction = actionBuilder( + return cfEntityCatalog.serviceBinding.actions.getAllForApplication( appGuid, cfGuid, paginationKey, { includeRelations: [ createEntityRelationKey(serviceBindingEntityType, applicationEntityType), @@ -42,7 +37,6 @@ export class AppServiceBindingDataSource extends ListDataSource, appService: ApplicationService, listConfig?: IListConfig>) { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.spec.ts index e9b6d2de3a..2d365bb272 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.spec.ts @@ -1,12 +1,13 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; -import { generateTestApplicationServiceProvider } from '../../../../../../../core/test-framework/application-service-helper'; +import { generateTestApplicationServiceProvider } from '../../../../../../test-framework/application-service-helper'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ApplicationEnvVarsHelper, } from '../../../../../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; +import { ApplicationStateService } from '../../../../services/application-state.service'; import { AppServiceBindingListConfigService } from './app-service-binding-list-config.service'; describe('AppServiceBindingListConfigService', () => { @@ -17,7 +18,8 @@ describe('AppServiceBindingListConfigService', () => { generateTestApplicationServiceProvider('1', '1'), ApplicationEnvVarsHelper, DatePipe, - ServiceActionHelperService + ServiceActionHelperService, + ApplicationStateService, ], imports: generateCfBaseTestModules() }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.ts index 6dd1fccbab..a11dc7151d 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service.ts @@ -4,7 +4,6 @@ import { Store } from '@ngrx/store'; import { switchMap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IServiceBinding } from '../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { @@ -20,6 +19,7 @@ import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { GetAppServiceBindings } from '../../../../../actions/application-service-routes.actions'; +import { IServiceBinding } from '../../../../../cf-api-svc.types'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { isServiceInstance, isUserProvidedServiceInstance } from '../../../../../features/cloud-foundry/cf.helpers'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; @@ -55,7 +55,8 @@ export class AppServiceBindingListConfigService extends BaseCfListConfig> = { action: (item) => { - this.serviceActionHelperService.editServiceBinding( + // FIXME: If the user cancels stepper this leaks #4295 + this.serviceActionHelperService.startEditServiceBindingStepper( item.entity.service_instance_guid, this.appService.cfGuid, { appId: this.appService.appGuid }, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts index 43ff0a9f2d..c16c3fc0b4 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts @@ -4,15 +4,13 @@ import { map } from 'rxjs/operators'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { appEnvVarsEntityType, applicationEntityType } from '../../../../../cf-entity-types'; import { ApplicationService } from '../../../../../features/applications/application.service'; @@ -31,11 +29,10 @@ export class CfAppVariablesDataSource extends ListDataSource, appService: ApplicationService, - listConfig: IListConfig + listConfig: IListConfig, ) { - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(appService.appGuid, appService.cfGuid) as PaginatedAction; + const getAppEnvVarsAction = cfEntityCatalog.appEnvVar.actions.getMultiple(appService.appGuid, appService.cfGuid); + super({ store, action: getAppEnvVarsAction, @@ -61,11 +58,8 @@ export class CfAppVariablesDataSource extends ListDataSource { - this.store.dispatch(action); + cfEntityCatalog.appEnvVar.api.removeFromApplication( + this.envVarsDataSource.appGuid, + this.envVarsDataSource.cfGuid, + this.envVarsDataSource.transformedEntities, + newValues + ); trigger$.next(); } ); @@ -119,8 +116,8 @@ export class CfAppVariablesListConfigService implements IListConfig, private appService: ApplicationService, - private confirmDialog: ConfirmationDialogService + private confirmDialog: ConfirmationDialogService, ) { this.envVarsDataSource = new CfAppVariablesDataSource(this.store, this.appService, this); } 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 53d3e043d9..886357b248 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 @@ -1,11 +1,11 @@ -/* tslint:disable:no-access-missing-member https://github.com/mgechev/codelyzer/issues/191*/ import { Component } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { EnvVarViewComponent } from '../../../../../../../../core/src/shared/components/env-var-view/env-var-view.component'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; +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', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/TableCellAppCfOrgSpaceBase.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/TableCellAppCfOrgSpaceBase.ts index 8a8ced84d6..718db5975e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/TableCellAppCfOrgSpaceBase.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/TableCellAppCfOrgSpaceBase.ts @@ -1,10 +1,10 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IApp } from '../../../../../../../core/src/core/cf-api.types'; import { TableCellCustom } from '../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { IApp } from '../../../../../cf-api.types'; +import { CfOrgSpaceLabelService } from '../../../../services/cf-org-space-label.service'; export class TableCellAppCfOrgSpaceBase extends TableCellCustom> { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.spec.ts index 31eb3c697d..b0734cebe9 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.spec.ts @@ -1,15 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { IApp } from '../../../../../../../../core/src/core/cf-api.types'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { SharedModule } from '../../../../../../../../core/src/shared/shared.module'; -import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResourceMetadata } 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 { CfOrgSpaceLinksComponent } from '../../../../cf-org-space-links/cf-org-space-links.component'; import { RunningInstancesComponent } from '../../../../running-instances/running-instances.component'; import { CardAppComponent } from './card-app.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts index 692f9f8c9b..8236ed5d64 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts @@ -6,22 +6,20 @@ import { map, startWith } 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 { IApp, ISpace } from '../../../../../../../../core/src/core/cf-api.types'; -import { getFavoriteFromCfEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; -import { - ApplicationStateData, - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; +import { getFavoriteFromEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; import { FavoritesConfigMapper, } from '../../../../../../../../core/src/shared/components/favorites-meta-card/favorite-config-mapper'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../../../../core/src/shared/shared.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; +import { IApp, ISpace } from '../../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; +import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; +import { ApplicationStateData, ApplicationStateService } from '../../../../../services/application-state.service'; +import { CfOrgSpaceLabelService } from '../../../../../services/cf-org-space-label.service'; @Component({ selector: 'app-card-app', @@ -58,11 +56,10 @@ export class CardAppComponent extends CardCell> implements OnI this.row.entity.space_guid ); - this.favorite = getFavoriteFromCfEntity(this.row, applicationEntityType, this.favoritesConfigMapper); + this.favorite = getFavoriteFromEntity(this.row, applicationEntityType, this.favoritesConfigMapper, CF_ENDPOINT_TYPE); const initState = this.appStateService.get(this.row.entity, null); this.applicationState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.row.entity, this.row.metadata.guid, 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 bc314a9aa7..a2b5398834 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 @@ -6,7 +6,6 @@ import { filter, first, map, switchMap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IApp } from '../../../../../../../core/src/core/cf-api.types'; import { UtilsService } from '../../../../../../../core/src/core/utils.service'; import { createTableColumnFavorite, @@ -21,6 +20,7 @@ import { import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { IFavoriteMetadata, UserFavorite } from '../../../../../../../store/src/types/user-favorites.types'; +import { IApp } from '../../../../../cf-api.types'; import { CfOrgSpaceDataService, createCfOrgSpaceFilterConfig } from '../../../../data-services/cf-org-space-service.service'; import { CardAppComponent } from './card/card-app.component'; import { CfAppsDataSource } from './cf-apps-data-source'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts index b58867c336..3a4849a95a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { Subscription } from 'rxjs'; import { tag } from 'rxjs-spy/operators/tag'; import { debounceTime, delay, distinctUntilChanged, map, withLatestFrom } from 'rxjs/operators'; @@ -6,7 +7,6 @@ import { debounceTime, delay, distinctUntilChanged, map, withLatestFrom } from ' import { GetAllApplications } from '../../../../../../../cloud-foundry/src/actions/application.actions'; import { applicationEntityType, - appStatsEntityType, organizationEntityType, routeEntityType, spaceEntityType, @@ -22,13 +22,12 @@ import { import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { CreatePagination } from '../../../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { MultiActionListEntity } from '../../../../../../../store/src/monitors/pagination-monitor'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationParam } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { cfOrgSpaceFilter, getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; +import { cfOrgSpaceFilter } from '../../../../../features/cloud-foundry/cf.helpers'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; @@ -44,18 +43,18 @@ export class CfAppsDataSource extends CFListDataSource { private subs: Subscription[]; public action: GetAllApplications; - constructor( store: Store, listConfig?: IListConfig, transformEntities?: any[], paginationKey = CfAppsDataSource.paginationKey, seedPaginationKey = CfAppsDataSource.paginationKey, - startingCfGuid?: string + cfGuid?: string ) { const syncNeeded = paginationKey !== seedPaginationKey; - const action = new GetAllApplications(paginationKey, null, CfAppsDataSource.includeRelations); - action.endpointGuid = startingCfGuid; + const action = cfEntityCatalog.application.actions.getMultiple(cfGuid, CfAppsDataSource.paginationKey, { + includeRelations: CfAppsDataSource.includeRelations, + }); const dispatchSequencer = new DispatchSequencer(store); @@ -107,12 +106,9 @@ export class CfAppsDataSource extends CFListDataSource { const appGuid = app.metadata.guid; const cfGuid = app.entity.cfGuid; if (appState === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAction = actionBuilder(appGuid, cfGuid); actions.push({ id: appGuid, - action: getAction + action: cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid) }); } }); 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 38ef9aa2bc..064ed53be4 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 @@ -11,11 +11,9 @@ import { import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from '../table-cell-app-status/table-cell-app-status.component'; describe('TableCellAppStatusComponent', () => { 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 38ef9aa2bc..064ed53be4 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 @@ -11,11 +11,9 @@ import { import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from '../table-cell-app-status/table-cell-app-status.component'; describe('TableCellAppStatusComponent', () => { 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 891b8aa15d..f5c2fdb4c9 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 @@ -2,8 +2,8 @@ import { Component, Input } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { IApp, ISpace } from '../../../../../../../../core/src/core/cf-api.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IApp, ISpace } from '../../../../../../cf-api.types'; import { TableCellAppCfOrgSpaceBase } from '../TableCellAppCfOrgSpaceBase'; @Component({ 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 807f663ad9..73d730dac9 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 @@ -11,11 +11,9 @@ import { import { ApplicationStateComponent, } from '../../../../../../../../core/src/shared/components/application-state/application-state.component'; -import { - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { ApplicationStateService } from '../../../../../services/application-state.service'; import { TableCellAppStatusComponent } from './table-cell-app-status.component'; describe('TableCellAppStatusComponent', () => { 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 4024d1e75a..06dd674a12 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 @@ -4,12 +4,9 @@ import { Observable } from 'rxjs'; import { startWith } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { - ApplicationStateData, - ApplicationStateService, -} from '../../../../../../../../core/src/shared/components/application-state/application-state.service'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; +import { ApplicationStateData, ApplicationStateService } from '../../../../../services/application-state.service'; @Component({ selector: 'app-table-cell-app-status', @@ -45,7 +42,6 @@ export class TableCellAppStatusComponent extends TableCellCustom implement ngOnInit() { const applicationState = this.appStateService.get(this.row.entity, null); this.fetchAppState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.row.entity, this.row.metadata.guid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component.ts index 59234152ae..05088b0e4d 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpack-card/cf-buildpack-card.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core'; -import { IBuildpack } from '../../../../../../../../core/src/core/cf-api.types'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IBuildpack } from '../../../../../../cf-api.types'; @Component({ selector: 'app-cf-buildpack-card', 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 240c641023..ae5065e46e 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 @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { FetchAllBuildpacks } from '../../../../../../../cloud-foundry/src/actions/buildpack.action'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { buildpackEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -11,19 +10,15 @@ import { } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; +import { getRowMetadata } from '../../../../../../../store/src/public-api'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; export class CfBuildpacksDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const buildpackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, buildpackEntityType); - const actionBuilder = buildpackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey) as PaginatedAction; + 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-buildpacks/cf-buildpacks-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-list-config.service.ts index 4f9b8b0f76..779c9cbcad 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-list-config.service.ts @@ -2,9 +2,9 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IBuildpack } from '../../../../../../../core/src/core/cf-api.types'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { IBuildpack } from '../../../../../cf-api.types'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfBuildpackCardComponent } from './cf-buildpack-card/cf-buildpack-card.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-list-config.service.ts index a825265f43..6bc5cdfb94 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-list-config.service.ts @@ -2,12 +2,12 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IApp, ISpace } from '../../../../../../../core/src/core/cf-api.types'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; +import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { IApp, ISpace } from '../../../../../cf-api.types'; import { ActiveRouteCfCell } from '../../../../../features/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfCellApp, CfCellAppsDataSource } from './cf-cell-apps-source'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-source.ts index 3dbc2319f2..6e834f3121 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-apps/cf-cell-apps-source.ts @@ -9,23 +9,21 @@ import { organizationEntityType, spaceEntityType, } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IApp } from '../../../../../../../core/src/core/cf-api.types'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; 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 { MetricQueryType } from '../../../../../../../core/src/shared/services/metrics-range-selector.types'; import { MetricQueryConfig } from '../../../../../../../store/src/actions/metrics.actions'; +import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { IMetrics, IMetricVectorResult } from '../../../../../../../store/src/types/base-metric.types'; import { IMetricApplication } from '../../../../../../../store/src/types/metric.types'; import { FetchCFMetricsPaginatedAction } from '../../../../../actions/cf-metrics.actions'; +import { IApp } from '../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { createEntityRelationKey } from '../../../../../entity-relations/entity-relations.types'; -// TODO: Move file to CF package (#3769) - export interface CfCellApp { metric: IMetricApplication; appGuid: string; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-health/cf-cell-health-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-health/cf-cell-health-list-config.service.ts index 5b5272fe7a..86bb2ee270 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-health/cf-cell-health-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cell-health/cf-cell-health-list-config.service.ts @@ -1,12 +1,12 @@ -// tslint:disable:max-line-length import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { first, tap } from 'rxjs/operators'; -import { CfCellHelper } from '../../../../../../../core/src/features/cloud-foundry/cf-cell.helpers'; -import { BooleanIndicatorType } from '../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { + BooleanIndicatorType, +} from '../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; import { TableCellBooleanIndicatorComponent, TableCellBooleanIndicatorComponentConfig, @@ -17,16 +17,13 @@ import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { PaginationMonitorFactory } from '../../../../../../../store/src/monitors/pagination-monitor.factory'; import { FetchCFCellMetricsPaginatedAction } from '../../../../../actions/cf-metrics.actions'; import { CFAppState } from '../../../../../cf-app-state'; +import { CfCellHelper } from '../../../../../features/cloud-foundry/cf-cell.helpers'; import { CloudFoundryCellService, } from '../../../../../features/cloud-foundry/tabs/cloud-foundry-cells/cloud-foundry-cell/cloud-foundry-cell.service'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfCellHealthDataSource, CfCellHealthEntry, CfCellHealthState } from './cf-cell-health-source'; - -// TODO: Move file to CF package (#3769) -// tslint:enable:max-line-length - @Injectable() export class CfCellHealthListConfigService extends BaseCfListConfig { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-data-source.ts index 56d0a0a5ca..033ef32875 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-data-source.ts @@ -1,7 +1,9 @@ import { Store } from '@ngrx/store'; import { map } from 'rxjs/operators'; -import { ListDataSource } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; +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 { IMetrics, IMetricVectorResult } from '../../../../../../../store/src/types/base-metric.types'; import { IMetricCell } from '../../../../../../../store/src/types/metric.types'; @@ -9,9 +11,6 @@ import { FetchCFCellMetricsPaginatedAction } from '../../../../../actions/cf-met import { CFAppState } from '../../../../../cf-app-state'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; - - -// TODO: Move file to CF package (#3769) export class CfCellsDataSource extends ListDataSource, IMetrics>> { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-list-config.service.ts index 85150f28e4..019ab20631 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-cells/cf-cells-list-config.service.ts @@ -1,12 +1,12 @@ -// tslint:disable:max-line-length import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { first, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { CfCellHelper } from '../../../../../../../core/src/features/cloud-foundry/cf-cell.helpers'; -import { BooleanIndicatorType } from '../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { + BooleanIndicatorType, +} from '../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; import { TableCellBooleanIndicatorComponent, TableCellBooleanIndicatorComponentConfig, @@ -17,10 +17,12 @@ import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { PaginationMonitorFactory } from '../../../../../../../store/src/monitors/pagination-monitor.factory'; import { IMetricVectorResult } from '../../../../../../../store/src/types/base-metric.types'; import { IMetricCell } from '../../../../../../../store/src/types/metric.types'; +import { CfCellHelper } from '../../../../../features/cloud-foundry/cf-cell.helpers'; import { ActiveRouteCfCell } from '../../../../../features/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfCellsDataSource } from './cf-cells-data-source'; +// tslint:disable:max-line-length // tslint:enable:max-line-length 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 10bf21bcfd..0911a517aa 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 @@ -2,7 +2,6 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { distinctUntilChanged, first, map } from 'rxjs/operators'; -import { CfEvent } from '../../../../../../../core/src/core/cf-api.types'; import { arraysEqual } from '../../../../../../../core/src/core/utils.service'; import { valueOrCommonFalsy, @@ -13,9 +12,10 @@ import { ListConfig, ListViewTypes, } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { AddParams, RemoveParams } from '../../../../../../../store/src/actions/pagination.actions'; +import { AddParams } from '../../../../../../../store/src/actions/pagination.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { CfEvent } from '../../../../../cf-api.types'; import { CFAppState } from '../../../../../cf-app-state'; import { QParam, QParamJoiners } from '../../../../q-param'; import { CfEventsDataSource } from './cf-events-data-source'; @@ -50,11 +50,7 @@ export class CfEventsConfigService extends ListConfig implements IL columnId: 'detail', headerCell: () => 'Detail', cellComponent: TableCellEventDetailComponent, cellFlex: '6' }, { - columnId: 'timestamp', - headerCell: () => 'Timestamp', - cellComponent: TableCellEventTimestampComponent, - sort: true, - cellFlex: '3' + columnId: 'timestamp', headerCell: () => 'Timestamp', cellComponent: TableCellEventTimestampComponent, sort: true, cellFlex: '3' }, ]; viewType = ListViewTypes.TABLE_ONLY; @@ -109,44 +105,18 @@ export class CfEventsConfigService extends ListConfig implements IL ).subscribe(currentFilters => { const action = this.eventSource.action as PaginatedAction; - - const addQs: { [key: string]: string } = {}; - const removeQs: string[] = []; - - if (!arraysEqual(values.type, currentFilters.type)) { - if (!!values.type && !!values.type.length) { - addQs.type = new QParam('type', values.type, QParamJoiners.in).toString(); - } else { - removeQs.push('type'); + // 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) + if (typeChanged || acteeChanged) { + const newQ: string[] = []; + if (values.type && values.type.length) { + newQ.push(new QParam('type', values.type, QParamJoiners.in).toString()); } - } - - if (valueOrCommonFalsy(values.actee) !== - valueOrCommonFalsy(currentFilters.actee)) { - - if (!!values.actee && !!values.actee.length) { - addQs.actee = new QParam('actee', values.actee, QParamJoiners.in).toString(); - } else { - removeQs.push('actee'); + if (values.actee && values.actee.length) { + newQ.push(new QParam('actee', values.actee, QParamJoiners.in).toString()); } - } - - if (!!Object.keys(addQs).length) { - const existingQ: { [key: string]: string } = {} = {}; - if (currentFilters.type && currentFilters.type.length) { - existingQ.type = new QParam('type', currentFilters.type, QParamJoiners.in).toString(); - } - if (currentFilters.actee) { - existingQ.actee = new QParam('actee', currentFilters.actee, QParamJoiners.in).toString(); - } - const newQ = { - ...existingQ, - ...addQs - }; - this.store.dispatch(new AddParams(action, this.eventSource.paginationKey, { q: Object.values(newQ) })); - } - if (!!removeQs.length) { - this.store.dispatch(new RemoveParams(action, action.paginationKey, [], removeQs)); + this.store.dispatch(new AddParams(action, this.eventSource.paginationKey, { q: newQ })); } }); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts index 42368617ee..47d5f725e9 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts @@ -1,18 +1,15 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; 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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { cfEventEntityType } from '../../../../../cf-entity-types'; -import { CfEventActionBuilders } from '../../../../../entity-action-builders/cf-event.action-builders'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { QParam, QParamJoiners } from '../../../../q-param'; export class CfEventsDataSource extends ListDataSource { @@ -25,18 +22,14 @@ export class CfEventsDataSource extends ListDataSource { spaceGuid?: string, actee?: string, ) { - const appEventEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - cfEventEntityType - ); - const actionBuilder = appEventEntity.actionOrchestrator.getActionBuilder('getMultiple'); const paginationKey = CfEventsDataSource.createPaginationKey( cfGuid, orgGuid, spaceGuid, actee ); - const action = actionBuilder(cfGuid, paginationKey); + + const action = cfEntityCatalog.event.actions.getMultiple(cfGuid, paginationKey) action.initialParams.q = CfEventsDataSource.createInitialQParams( orgGuid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/event-metadata/event-metadata.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/event-metadata/event-metadata.component.ts index 276baed544..004d469c97 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/event-metadata/event-metadata.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/event-metadata/event-metadata.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, Input, OnInit, Optional } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialog } from '@angular/material'; +import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; @Component({ selector: 'app-event-metadata', 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.scss b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.scss index 5153bfd330..b1aab5797b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.scss +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-actee/table-cell-event-actee.component.scss @@ -3,6 +3,7 @@ display: flex; flex-direction: row; flex-wrap: wrap; + word-break: break-word; mat-icon { // Note - Should be 5px but some icons aren't 24x24 (`service-instance`) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component.scss index aa898743b3..98ff207857 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component.scss +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-action/table-cell-event-action.component.scss @@ -3,6 +3,7 @@ div { display: flex; flex-direction: row; flex-wrap: wrap; + word-break: break-word; mat-icon { margin-right: 10px; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.spec.ts index 9226ebe168..777f255527 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CfEvent } from '../../../../../../../../core/src/core/cf-api.types'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { ValuesPipe } from '../../../../../../../../core/src/shared/pipes/values.pipe'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { CfEvent } from '../../../../../../cf-api.types'; import { EventMetadataComponent } from '../event-metadata/event-metadata.component'; import { TableCellEventDetailComponent } from './table-cell-event-detail.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.ts index 843a92aa6a..6133dbfe14 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-detail/table-cell-event-detail.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core'; -import { CfEvent } from '../../../../../../../../core/src/core/cf-api.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { CfEvent } from '../../../../../../cf-api.types'; /* tslint:disable:no-access-missing-member https://github.com/mgechev/codelyzer/issues/191*/ @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts deleted file mode 100644 index be5fd42b22..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - createEntityRelationPaginationKey, -} from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { featureFlagEntityType } from '../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; - -export function createCfFeatureFlagFetchAction(cfGuid: string) { - const paginationKey = createCFFeatureFlagPaginationKey(cfGuid); - const featureFlagEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, featureFlagEntityType); - const actionBuilder = featureFlagEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey) as PaginatedAction; - action.flattenPagination = true; - return action; -} - -export function createCFFeatureFlagPaginationKey(cfGuid: string) { - return createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts index 3981cf1173..2039058a23 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts @@ -2,14 +2,14 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { featureFlagEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IFeatureFlag } from '../../../../../../../core/src/core/cf-api.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 { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { IFeatureFlag } from '../../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { createCfFeatureFlagFetchAction } from './cf-feature-flags-data-source.helpers'; export const FeatureFlagDescriptions = { user_org_creation: 'Any user can create an organization', @@ -35,7 +35,7 @@ export class CfFeatureFlagsDataSource extends ListDataSource { static descriptionColumnId = 'description'; constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { - const action = createCfFeatureFlagFetchAction(cfGuid); + const action = cfEntityCatalog.featureFlag.actions.getMultiple(cfGuid); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts index e308c75400..f943e373ad 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts @@ -2,15 +2,17 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IFeatureFlag } from '../../../../../../../core/src/core/cf-api.types'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { IListFilter, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; +import { IFeatureFlag } from '../../../../../cf-api.types'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfFeatureFlagsDataSource } from './cf-feature-flags-data-source'; +import { + TableCellFeatureFlagDescriptionComponent, +} from './table-cell-feature-flag-description/table-cell-feature-flag-description.component'; import { TableCellFeatureFlagStateComponent } from './table-cell-feature-flag-state/table-cell-feature-flag-state.component'; -import { TableCellFeatureFlagDescriptionComponent } from './table-cell-feature-flag-description/table-cell-feature-flag-description.component'; @Injectable() export class CfFeatureFlagsListConfigService extends BaseCfListConfig { 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 36d5c4eab7..de671fa58f 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 @@ -1,6 +1,7 @@ import { Component, Input } from '@angular/core'; import { TableCellCustom } from 'frontend/packages/core/src/shared/components/list/list.types'; -import { IFeatureFlag } from 'frontend/packages/core/src/core/cf-api.types'; + +import { IFeatureFlag } from '../../../../../../cf-api.types'; import { FeatureFlagDescriptions } from '../cf-feature-flags-data-source'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component.ts index 20b720023b..1d8725ddc4 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/table-cell-feature-flag-state/table-cell-feature-flag-state.component.ts @@ -1,7 +1,7 @@ import { Component, Input } from '@angular/core'; -import { IFeatureFlag } from '../../../../../../../../core/src/core/cf-api.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; +import { IFeatureFlag } from '../../../../../../cf-api.types'; @Component({ selector: 'app-table-cell-feature-flag-state', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-org-users/cf-org-users-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-org-users/cf-org-users-list-config.service.spec.ts index f6c0b51a50..10944e2dd7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-org-users/cf-org-users-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-org-users/cf-org-users-list-config.service.spec.ts @@ -10,7 +10,7 @@ import { } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { CloudFoundryEndpointService } from '../../../../../features/cloud-foundry/services/cloud-foundry-endpoint.service'; import { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.spec.ts index a13fb94379..1df1add336 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-orgs/cf-org-card/cf-org-card.component.spec.ts @@ -1,13 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; +import { testSessionData } from '@stratos/store/testing'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { MetadataCardTestComponents } from '../../../../../../../../core/test-framework/core-test.helper'; -import { testSessionData } from '@stratos/store/testing'; import { VerifiedSession } from '../../../../../../../../store/src/actions/auth.actions'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; +import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfBaseTestModulesNoShared, generateTestCfEndpointServiceProvider, @@ -84,7 +84,8 @@ describe('CfOrgCardComponent', () => { billing_managers_url: '/v2/organizations/a63027a8-e160-4e71-ad59-6675aa94a886/billing_managers', auditors_url: '/v2/organizations/a63027a8-e160-4e71-ad59-6675aa94a886/auditors', app_events_url: '/v2/organizations/a63027a8-e160-4e71-ad59-6675aa94a886/app_events', - space_quota_definitions_url: '/v2/organizations/a63027a8-e160-4e71-ad59-6675aa94a886/space_quota_definitions' + space_quota_definitions_url: '/v2/organizations/a63027a8-e160-4e71-ad59-6675aa94a886/space_quota_definitions', + domains: [] } }, developers_url: '/v2/spaces/d87ba175-51ec-4cc9-916c-bee26d00e498/developers', 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 f6a004f6b6..c229dd2e8d 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 @@ -6,11 +6,9 @@ import { map, publishReplay, refCount, switchMap, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { organizationEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { createUserRoleInOrg } from '../../../../../../../../cloud-foundry/src/store/types/user.types'; -import { IApp, IOrganization } from '../../../../../../../../core/src/core/cf-api.types'; -import { getStartedAppInstanceCount } from '../../../../../../../../core/src/core/cf.helpers'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; -import { getFavoriteFromCfEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; import { truthyIncludingZeroString } from '../../../../../../../../core/src/core/utils.service'; import { ConfirmationDialogConfig } from '../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; @@ -28,7 +26,9 @@ import { PaginationMonitorFactory } from '../../../../../../../../store/src/moni import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { EndpointUser } from '../../../../../../../../store/src/types/endpoint.types'; import { IFavoriteMetadata, UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; +import { IApp, IOrganization } from '../../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; +import { getStartedAppInstanceCount } from '../../../../../../cf.helpers'; import { getOrgRolesString } from '../../../../../../features/cloud-foundry/cf.helpers'; import { CloudFoundryEndpointService, @@ -38,6 +38,7 @@ import { createOrgQuotaDefinition, } from '../../../../../../features/cloud-foundry/services/cloud-foundry-organization.service'; import { CfUserService } from '../../../../../data-services/cf-user.service'; +import { CF_ENDPOINT_TYPE } from './../../../../../../cf-types'; @Component({ @@ -101,7 +102,7 @@ export class CfOrgCardComponent extends CardCell> imp refCount() ); - this.favorite = getFavoriteFromCfEntity(this.row, organizationEntityType, this.favoritesConfigMapper); + this.favorite = getFavoriteFromEntity(this.row, organizationEntityType, this.favoritesConfigMapper, 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 index f4ab223495..9149423b08 100644 --- 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 @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { organizationEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; @@ -8,7 +9,6 @@ import { 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 { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CloudFoundryEndpointService } from '../../../../../features/cloud-foundry/services/cloud-foundry-endpoint.service'; export class CfOrgsDataSourceService extends ListDataSource { 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 index 3c04ae7467..4ab0ef44aa 100644 --- 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 @@ -2,9 +2,9 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IOrganization } from '../../../../../../../core/src/core/cf-api.types'; 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/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfOrgCardComponent } from './cf-org-card/cf-org-card.component'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts similarity index 70% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts index 548c5675c3..09c980b0d2 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-data-source.service.ts @@ -1,21 +1,23 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { of } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { GetQuotaDefinitions } from '../../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { cfEntityFactory } from '../../../../../../../cloud-foundry/src/cf-entity-factory'; -import { quotaDefinitionEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { - createEntityRelationPaginationKey, -} from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { getRowMetadata } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; + ListDataSource, +} from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; +import { + getDefaultRowState, +} from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; +import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; -import { APIResource } from '../../../../../../../store/src/types/api.types'; import { EntityMonitor } from '../../../../../../../store/src/monitors/entity-monitor'; -import { ListDataSource } from '../../data-sources-controllers/list-data-source'; -import { getDefaultRowState } from '../../data-sources-controllers/list-data-source-types'; -import { IListConfig } from '../../list.component.types'; +import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityFactory } from '../../../../../cf-entity-factory'; +import { quotaDefinitionEntityType } from '../../../../../cf-entity-types'; +import { createEntityRelationPaginationKey } from '../../../../../entity-relations/entity-relations.types'; export class CfQuotasDataSourceService extends ListDataSource { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts similarity index 71% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts index 33e1baf7df..edb7b87023 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.spec.ts @@ -1,11 +1,11 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; -import { CfQuotasListConfigService } from './cf-quotas-list-config.service'; +import { CFBaseTestModules } from '../../../../../../test-framework/cf-test-helper'; import { - generateTestCfEndpointServiceProvider -} from '../../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; -import { CFBaseTestModules } from '../../../../../../../cloud-foundry/test-framework/cf-test-helper'; + generateTestCfEndpointServiceProvider, +} from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfQuotasListConfigService } from './cf-quotas-list-config.service'; describe('CfQuotasListConfigService', () => { beforeEach(() => { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts similarity index 82% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts index b1fd91bab2..9840ba444f 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/cf-quotas-list-config.service.ts @@ -3,21 +3,23 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; +import { DeleteQuotaDefinition } from '../../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; +import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; +import { ActiveRouteCfOrgSpace } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; +import { + BaseCfListConfig, +} from '../../../../../../../cloud-foundry/src/shared/components/list/list-types/base-cf/base-cf-list-config'; +import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; +import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; +import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; +import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; +import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; +import { IListAction, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../../core/cf-api.types'; -import { CurrentUserPermissions } from '../../../../../core/current-user-permissions.config'; -import { CurrentUserPermissionsService } from '../../../../../core/current-user-permissions.service'; -import { ConfirmationDialogConfig } from '../../../confirmation-dialog.config'; -import { ConfirmationDialogService } from '../../../confirmation-dialog.service'; -import { ITableColumn } from '../../list-table/table.types'; -import { IListAction, ListViewTypes } from '../../list.component.types'; +import { IQuotaDefinition } from '../../../../../cf-api.types'; import { CfQuotasDataSourceService } from './cf-quotas-data-source.service'; import { TableCellQuotaComponent } from './table-cell-quota/table-cell-quota.component'; -import { BaseCfListConfig } from '../../../../../../../cloud-foundry/src/shared/components/list/list-types/base-cf/base-cf-list-config'; -import { ActiveRouteCfOrgSpace } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { DeleteQuotaDefinition } from '../../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; export const QUOTA_FROM_LIST = 'list'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.html diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.scss diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts similarity index 95% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts index 011a58c91b..10e4abeef9 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { createBasicStoreModule } from '@stratos/store/testing'; -import { IQuotaDefinition } from '../../../../../../core/cf-api.types'; +import { IQuotaDefinition } from '../../../../../../cf-api.types'; import { TableCellQuotaComponent } from './table-cell-quota.component'; describe('TableCellQuotaComponent', () => { diff --git a/src/frontend/packages/core/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 similarity index 76% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-quotas/table-cell-quota/table-cell-quota.component.ts index 7958398fbd..83a47399bc 100644 --- a/src/frontend/packages/core/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 @@ -1,8 +1,8 @@ import { Component, OnInit } from '@angular/core'; +import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../../../core/cf-api.types'; -import { TableCellCustom } from '../../../list.types'; +import { IQuotaDefinition } from '../../../../../../cf-api.types'; @Component({ selector: 'app-table-cell-quota', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts index f862c9380d..625fa99aec 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts @@ -1,10 +1,10 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { combineLatest, Observable, Subscription } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { routeEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; import { safeUnsubscribe } from '../../../../../../../core/src/core/utils.service'; import { ListPaginationMultiFilterChange, @@ -14,14 +14,16 @@ import { TableRowStateManager, } from '../../../../../../../core/src/shared/components/list/list-table/table-row/table-row-state-manager'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { AppState } from '../../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitor } from '../../../../../../../store/src/monitors/pagination-monitor'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction, PaginationParam } from '../../../../../../../store/src/types/pagination.types'; +import { IRoute } from '../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { getRoute, isTCPRoute } from '../../../../../features/applications/routes/routes.helper'; -import { cfOrgSpaceFilter, getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; +import { cfOrgSpaceFilter } from '../../../../../features/cloud-foundry/cf.helpers'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; @@ -117,7 +119,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationKey, genericRouteState: boolean, isLocal: boolean): { rowsState: Observable, sub: Subscription } { @@ -135,7 +137,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationKey: string, isLocal: boolean): { + private static getRowStateManager(store: Store, paginationKey: string, isLocal: boolean): { rowStateManager: TableRowStateManager, sub: Subscription } { @@ -151,7 +153,6 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationMonitor: PaginationMonitor, rowStateManager: TableRowStateManager ) { @@ -174,7 +174,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource { const unmapping = request.updating.unmapping || { busy: false }; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts index 27a4ce752b..399f36644b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts @@ -1,15 +1,13 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { IListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { routeEntityType } from '../../../../../cf-entity-types'; +import { IRoute } from '../../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { CfRoutesDataSourceBase } from '../cf-routes/cf-routes-data-source-base'; @@ -20,11 +18,7 @@ export class CfRoutesDataSource extends CfRoutesDataSourceBase implements IListD listConfig: IListConfig, cfGuid: string ) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const createRouteAction = actionBuilder(cfGuid, null); - super(store, listConfig, cfGuid, createRouteAction, true); + super(store, listConfig, cfGuid, cfEntityCatalog.route.actions.getMultiple(cfGuid, null, {}), true); } - } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts index ba099a47b8..b1a7ae262b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts @@ -4,7 +4,6 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { ITableColumn, ITableText } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; @@ -16,9 +15,8 @@ import { IMultiListAction, ListViewTypes, } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { TableCellRouteAppsAttachedComponent, } from '../cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component'; @@ -88,8 +86,6 @@ export abstract class CfRoutesListConfigBase implements IListConfig }; enableTextFilter = true; - private routeCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - private multiListActionDelete: IMultiListAction = { action: (items: APIResource[]) => { if (items.length === 1) { @@ -136,7 +132,7 @@ export abstract class CfRoutesListConfigBase implements IListConfig private dispatchDeleteAction(route: APIResource) { const appGuids = (route.entity.apps || []).map(app => app.metadata.guid); const singleApp = appGuids.length === 1; - this.routeCatalogEntity.actionDispatchManager.dispatchDelete( + cfEntityCatalog.route.api.delete( route.metadata.guid, this.cfGuid, // FIXME: The appGuid/appGuids params need merging @@ -147,7 +143,7 @@ export abstract class CfRoutesListConfigBase implements IListConfig private dispatchUnmapAction(routeGuid: string, appGuids: string[]) { appGuids.forEach(appGuid => { - this.routeCatalogEntity.actionDispatchManager.dispatchAction('unmap', + cfEntityCatalog.route.api.unmap( routeGuid, appGuid, this.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.spec.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.spec.ts index 71d085e1d7..9ac357c8b7 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.spec.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.spec.ts @@ -4,7 +4,7 @@ import { AppChipsComponent } from '../../../../../../../../core/src/shared/compo import { generateCfBaseTestModulesNoShared, } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { TableCellRouteAppsAttachedComponent } from './table-cell-route-apps-attached.component'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component.ts index c827fb2335..a93e2e1137 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-card/cf-security-groups-card.component.ts @@ -1,9 +1,9 @@ import { Component, OnInit } from '@angular/core'; -import { IRule, IRuleType, ISpace } from '../../../../../../../../core/src/core/cf-api.types'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IRule, IRuleType, ISpace } from '../../../../../../cf-api.types'; import { CloudFoundryEndpointService, } from '../../../../../../features/cloud-foundry/services/cloud-foundry-endpoint.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts index 670afdb18c..6d6fe29a76 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts @@ -1,6 +1,6 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; -import { GetAllSecurityGroups } from '../../../../../../../cloud-foundry/src/actions/security-groups-actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { securityGroupEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -12,17 +12,13 @@ import { import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; export class CfSecurityGroupsDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const sgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, securityGroupEntityType); - const actionBuilder = sgEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); + const action = cfEntityCatalog.securityGroup.actions.getMultiple(cfGuid, paginationKey, {}) super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-data-source.service.ts index 670ee1ba62..e30ec5e1bc 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-data-source.service.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { cfUserEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; @@ -12,7 +13,6 @@ import { IListConfig } from '../../../../../../../core/src/shared/components/lis import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfSelectUsersDataSourceService extends ListDataSource { constructor( diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts index 46a8c9d81c..a60d8d0c6c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts @@ -59,7 +59,7 @@ export class CfSelectUsersListConfigService implements IListConfig, private cfGuid: string, - private cfUserService: CfUserService, + cfUserService: CfUserService, private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private paginationMonitorFactory: PaginationMonitorFactory, private entityMonitorFactory: EntityMonitorFactory diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.spec.ts index c1a9beee23..33a16be1da 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.spec.ts @@ -4,8 +4,8 @@ import { BooleanIndicatorComponent, } from '../../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; import { AppChipsComponent } from '../../../../../../../../core/src/shared/components/chips/chips.component'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { MetadataCardTestComponents } from '../../../../../../../../core/test-framework/core-test.helper'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { generateCfBaseTestModulesNoShared, } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; @@ -62,11 +62,10 @@ describe('CfServiceCardComponent', () => { extra: '', tags: [''], requires: [''], - service_broker_guid: '', + service_broker_guid: 'service_broker_guid', plan_updateable: 1, service_plans_url: '', service_plans: [], - }, metadata: null }; 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 eb28c1b577..f3696b8c7a 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 @@ -3,14 +3,14 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { IService, IServiceExtra } from '../../../../../../../../core/src/core/cf-api-svc.types'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService, IServiceExtra } from '../../../../../../cf-api-svc.types'; import { getServiceBrokerName, getServiceName } from '../../../../../../features/service-catalog/services-helper'; +import { CfOrgSpaceLabelService } from '../../../../../services/cf-org-space-label.service'; export interface ServiceTag { value: string; @@ -50,7 +50,6 @@ export class CfServiceCardComponent extends CardCell> { this.serviceBrokerName$ = getServiceBrokerName( this.serviceEntity.entity.service_broker_guid, this.serviceEntity.entity.cfGuid, - this.entityServiceFactory ); } } @@ -58,7 +57,6 @@ export class CfServiceCardComponent extends CardCell> { constructor( private store: Store, - private entityServiceFactory: EntityServiceFactory ) { super(); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-instances-list-config.base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-instances-list-config.base.ts index 8ae65a4138..0587430dbe 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-instances-list-config.base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-instances-list-config.base.ts @@ -5,19 +5,12 @@ import { Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IServiceInstance } from '../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { ITableColumn, ITableText } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; -import { - TableCellServiceLastOpComponent, -} from '../../../../../../../core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component'; -import { - TableCellServiceComponent, -} from '../../../../../../../core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component'; import { defaultPaginationPageSizeOptionsTable, IListAction, @@ -26,6 +19,7 @@ import { } 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 { IServiceInstance } from '../../../../../cf-api-svc.types'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; import { CANCEL_ORG_ID_PARAM, CANCEL_SPACE_ID_PARAM } from '../../../add-service-instance/csi-mode.service'; import { @@ -38,6 +32,10 @@ import { import { TableCellServiceInstanceTagsComponent, } from '../cf-spaces-service-instances/table-cell-service-instance-tags/table-cell-service-instance-tags.component'; +import { + TableCellServiceLastOpComponent, +} from '../cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component'; +import { TableCellServiceComponent } from '../cf-spaces-service-instances/table-cell-service/table-cell-service.component'; interface CanCache { [spaceGuid: string]: Observable; @@ -149,7 +147,7 @@ export class CfServiceInstancesListConfigBase implements IListConfig = { action: (item: APIResource) => - this.serviceActionHelperService.editServiceBinding(item.metadata.guid, item.entity.cfGuid, { + this.serviceActionHelperService.startEditServiceBindingStepper(item.metadata.guid, item.entity.cfGuid, { [CANCEL_SPACE_ID_PARAM]: item.entity.space_guid, [CANCEL_ORG_ID_PARAM]: item.entity.space.entity.organization_guid }), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts index 651f3bd158..e0a1c8eeef 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts @@ -1,27 +1,26 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { serviceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; export class CfServicesDataSource extends ListDataSource { constructor(store: Store, endpointGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicesAction = actionBuilder(endpointGuid, paginationKey); + const getServicesAction = cfEntityCatalog.service.actions.getMultiple(endpointGuid, paginationKey, {}) super({ store, action: getServicesAction, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-user-service-instances-list-config.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-user-service-instances-list-config.ts index 707759b41b..9c20d74796 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-user-service-instances-list-config.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-user-service-instances-list-config.ts @@ -5,7 +5,6 @@ import { Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IUserProvidedServiceInstance } from '../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { @@ -20,6 +19,7 @@ import { } 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 { IUserProvidedServiceInstance } from '../../../../../cf-api-svc.types'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; import { @@ -144,7 +144,7 @@ export class CfUserServiceInstancesListConfigBase implements IListConfig = { action: (item: APIResource) => - this.serviceActionHelperService.editServiceBinding( + this.serviceActionHelperService.startEditServiceBindingStepper( item.metadata.guid, item.entity.cfGuid, { 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 101b1416f1..0cb53ef299 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,8 +1,8 @@ import { Component, Input } from '@angular/core'; -import { IService } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-active', 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 c712a163fa..fb4815f3fc 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,8 +1,8 @@ import { Component, Input } from '@angular/core'; -import { IService } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-bindable', 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 b9bc892439..ec34e51905 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 @@ -1,11 +1,11 @@ import { Component, Input } from '@angular/core'; import { Store } from '@ngrx/store'; -import { IService } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService } from '../../../../../../cf-api-svc.types'; import { CFAppState } from '../../../../../../cf-app-state'; +import { CfOrgSpaceLabelService } from '../../../../../services/cf-org-space-label.service'; @Component({ selector: 'app-table-cell-service-cf-breadcrumbs', 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 2d54a4389d..2e7687d1d5 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 @@ -1,8 +1,8 @@ import { Component, Input } from '@angular/core'; -import { IService, IServiceExtra } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService, IServiceExtra } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-provider', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component.ts index c147decdec..00c308ba7b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-references/table-cell-service-references.component.ts @@ -1,8 +1,8 @@ import { Component, Input } from '@angular/core'; -import { IService, IServiceExtra } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService, IServiceExtra } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-references', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component.ts index 2ed6fd4f93..786bcaffc4 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/table-cell-service-tags/table-cell-service-tags.component.ts @@ -1,10 +1,10 @@ import { Component, Input } from '@angular/core'; import { of } from 'rxjs'; -import { IService } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IService } from '../../../../../../cf-api-svc.types'; import { ServiceTag } from '../cf-service-card/cf-service-card.component'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts index f7721a1783..3c7cbaaffe 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts @@ -1,28 +1,31 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, spaceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; export class CfSpaceAppsDataSource extends ListDataSource { constructor(store: Store, cfSpaceService: CloudFoundrySpaceService, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, cfSpaceService.spaceGuid) + '-tab'; - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfSpaceService.spaceGuid, cfSpaceService.cfGuid, paginationKey, [], false, false) as PaginatedAction; + const action = cfEntityCatalog.application.actions.getAllInSpace( + cfSpaceService.spaceGuid, + cfSpaceService.cfGuid, + paginationKey, + [], + false, + false + ) super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.spec.ts index 95ea99eef0..81ce704340 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.spec.ts @@ -2,7 +2,7 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { CfSpaceAppsListConfigService } from './cf-space-apps-list-config.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.ts index 69f867b749..60065a1ebb 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-list-config.service.ts @@ -5,7 +5,6 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { ISpaceFavMetadata } from '../../../../../../../cloud-foundry/src/cf-metadata-types'; -import { IApp } from '../../../../../../../core/src/core/cf-api.types'; import { createTableColumnFavorite, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-favorite/table-cell-favorite.component'; @@ -18,6 +17,7 @@ import { import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { UserFavorite } from '../../../../../../../store/src/types/user-favorites.types'; +import { IApp } from '../../../../../cf-api.types'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { TableCellAppNameComponent } from '../app/table-cell-app-name/table-cell-app-name.component'; import { TableCellAppStatusComponent } from '../app/table-cell-app-status/table-cell-app-status.component'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts similarity index 66% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts index 635cac7e07..39cc613e32 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-data-source.service.ts @@ -1,23 +1,23 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { of } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { - GetOrganizationSpaceQuotaDefinitions, -} from '../../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { cfEntityFactory } from '../../../../../../../cloud-foundry/src/cf-entity-factory'; -import { spaceQuotaEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; + ListDataSource, +} from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { - createEntityRelationPaginationKey, -} from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { getRowMetadata } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; + getDefaultRowState, +} from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; +import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; -import { APIResource } from '../../../../../../../store/src/types/api.types'; import { EntityMonitor } from '../../../../../../../store/src/monitors/entity-monitor'; -import { ListDataSource } from '../../data-sources-controllers/list-data-source'; -import { getDefaultRowState } from '../../data-sources-controllers/list-data-source-types'; -import { IListConfig } from '../../list.component.types'; +import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { GetOrganizationSpaceQuotaDefinitions } from '../../../../../actions/quota-definitions.actions'; +import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityFactory } from '../../../../../cf-entity-factory'; +import { spaceQuotaEntityType } from '../../../../../cf-entity-types'; +import { createEntityRelationPaginationKey } from '../../../../../entity-relations/entity-relations.types'; export class CfOrgSpaceQuotasDataSourceService extends ListDataSource { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts similarity index 72% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts index df0b70c4b7..bb899820da 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.spec.ts @@ -1,11 +1,11 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; -import { CfSpaceQuotasListConfigService } from './cf-space-quotas-list-config.service'; +import { CFBaseTestModules } from '../../../../../../test-framework/cf-test-helper'; import { - generateTestCfEndpointServiceProvider -} from '../../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; -import { CFBaseTestModules } from '../../../../../../../cloud-foundry/test-framework/cf-test-helper'; + generateTestCfEndpointServiceProvider, +} from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfSpaceQuotasListConfigService } from './cf-space-quotas-list-config.service'; describe('CfSpaceQuotasListConfigService', () => { beforeEach(() => { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts similarity index 79% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts index 6905bfbd3c..3cfc6e83c1 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-quotas/cf-space-quotas-list-config.service.ts @@ -3,22 +3,22 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; +import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; +import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; +import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; +import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; +import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; +import { IListAction, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../../core/cf-api.types'; -import { CurrentUserPermissions } from '../../../../../core/current-user-permissions.config'; -import { CurrentUserPermissionsService } from '../../../../../core/current-user-permissions.service'; -import { ConfirmationDialogConfig } from '../../../confirmation-dialog.config'; -import { ConfirmationDialogService } from '../../../confirmation-dialog.service'; -import { ITableColumn } from '../../list-table/table.types'; -import { IListAction, ListViewTypes } from '../../list.component.types'; +import { DeleteSpaceQuotaDefinition } from '../../../../../actions/quota-definitions.actions'; +import { IQuotaDefinition } from '../../../../../cf-api.types'; +import { CFAppState } from '../../../../../cf-app-state'; +import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; +import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { QUOTA_FROM_LIST } from '../cf-quotas/cf-quotas-list-config.service'; import { TableCellQuotaComponent } from '../cf-quotas/table-cell-quota/table-cell-quota.component'; import { CfOrgSpaceQuotasDataSourceService } from './cf-space-quotas-data-source.service'; -import { BaseCfListConfig } from '../../../../../../../cloud-foundry/src/shared/components/list/list-types/base-cf/base-cf-list-config'; -import { ActiveRouteCfOrgSpace } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { DeleteSpaceQuotaDefinition } from '../../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; @Injectable() export class CfSpaceQuotasListConfigService extends BaseCfListConfig> { 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 e29bca0710..553a0b3299 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 @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, @@ -12,14 +11,13 @@ import { createEntityRelationKey, createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { IListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { IRoute } from '../../../../../cf-api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { CfRoutesDataSourceBase } from '../cf-routes/cf-routes-data-source-base'; @@ -32,13 +30,12 @@ export class CfSpaceRoutesDataSource extends CfRoutesDataSourceBase implements I cfGuid: string ) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(spaceGuid, cfGuid, paginationKey, [ - createEntityRelationKey(routeEntityType, applicationEntityType), - createEntityRelationKey(routeEntityType, domainEntityType), - ], true, false) as PaginatedAction; - + const action = cfEntityCatalog.route.actions.getAllInSpace( + spaceGuid, cfGuid, paginationKey, [ + 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-space-routes/cf-space-routes-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-list-config.service.spec.ts index 9889896e9d..7f8531ebd3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-list-config.service.spec.ts @@ -2,7 +2,7 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../test-framework/cloud-foundry-space.service.mock'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { CfSpaceRoutesListConfigService } from './cf-space-routes-list-config.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-users/cf-space-users-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-users/cf-space-users-list-config.service.spec.ts index fda94b5235..17b9e153bf 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-users/cf-space-users-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-users/cf-space-users-list-config.service.spec.ts @@ -4,8 +4,8 @@ import { inject, TestBed } from '@angular/core/testing'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../test-framework/cloud-foundry-space.service.mock'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { CloudFoundryEndpointService } from '../../../../../features/cloud-foundry/services/cloud-foundry-endpoint.service'; import { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts index 0635f65e7a..e4fff5a9c7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -18,21 +19,14 @@ 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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../../../../entity-action-builders/service-instance.action.builders'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfSpacesServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, spaceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const serviceInstanceEntity = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(spaceGuid, cfGuid, paginationKey, null, { + const action = cfEntityCatalog.serviceInstance.actions.getAllInSpace(spaceGuid, cfGuid, paginationKey, null, { includeRelations: [ createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType), createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.spec.ts index 534bd94e9a..035322ecdc 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.spec.ts @@ -2,7 +2,7 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { getCfSpaceServiceMock } from '../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +import { getCfSpaceServiceMock } from '../../../../../../test-framework/cloud-foundry-space.service.mock'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; import { CfSpacesServiceInstancesListConfigService } from './cf-spaces-service-instances-list-config.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.ts index 96c8638a85..2b60252659 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-list-config.service.ts @@ -3,10 +3,10 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { IServiceInstance } from '../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../../cf-api-svc.types'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; import { ServiceActionHelperService } from '../../../../data-services/service-action-helper.service'; import { CfServiceInstancesListConfigBase } from '../cf-services/cf-service-instances-list-config.base'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts index b444fefc85..393b1dd078 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts @@ -1,6 +1,6 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; -import { GetAllUserProvidedServices } from '../../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, @@ -22,21 +22,14 @@ import { IListConfig, } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { UserProvidedServiceActionBuilder } from '../../../../../entity-action-builders/user-provided-service.action-builders'; export class CfSpacesUserServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, spaceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const userProvidedServiceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - userProvidedServiceInstanceEntityType - ); - const actionBuilder = userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfGuid, spaceGuid, paginationKey, + const action = cfEntityCatalog.userProvidedService.actions.getAllInSpace( + cfGuid, spaceGuid, paginationKey, [ createEntityRelationKey(userProvidedServiceInstanceEntityType, spaceWithOrgEntityType), createEntityRelationKey(spaceEntityType, organizationEntityType), 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.spec.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.spec.ts index babf907da5..57ab449c0e 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.spec.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.spec.ts @@ -51,7 +51,7 @@ describe('TableCellServiceInstanceAppsAttachedComponent', () => { }, metadata: { created_at: '', - guid: '', + guid: 'guid', updated_at: '', url: '' } 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 5270763504..be4145b2a2 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 @@ -2,11 +2,10 @@ import { Component, Input, OnInit } from '@angular/core'; import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { IServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; import { applicationEntityType, serviceBindingEntityType, @@ -26,12 +25,6 @@ export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCust config$ = new BehaviorSubject(null); row$ = new BehaviorSubject>(null); - constructor( - private entityServiceFactory: EntityServiceFactory, - ) { - super(); - } - @Input('config') set config(config: any) { this.config$.next(config); @@ -57,7 +50,6 @@ export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCust getCfServiceInstance( row.metadata.guid, row.entity.cfGuid, - this.entityServiceFactory, [ createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType), createEntityRelationKey(serviceBindingEntityType, applicationEntityType) 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 624d8fb1af..fe237bc1a9 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 @@ -1,10 +1,10 @@ import { Component, Input } from '@angular/core'; import { of as observableOf } from 'rxjs'; -import { IServiceInstance, IUserProvidedServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServiceInstance, IUserProvidedServiceInstance } from '../../../../../../cf-api-svc.types'; interface Tag { value: string; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.html 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.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.html rename to 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.html diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.scss 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.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.scss rename to 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.scss diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.spec.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.spec.ts similarity index 86% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.spec.ts rename to 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.spec.ts index 0b6685da67..00239ea2a1 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.spec.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.spec.ts @@ -1,8 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { + BooleanIndicatorComponent, +} from '../../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { BaseTestModulesNoShared } from '../../../../../../../../core/test-framework/core-test.helper'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { BaseTestModulesNoShared } from '../../../../../../../test-framework/core-test.helper'; -import { BooleanIndicatorComponent } from '../../../../boolean-indicator/boolean-indicator.component'; import { ServiceInstanceLastOpComponent } from '../../../../service-instance-last-op/service-instance-last-op.component'; import { TableCellServiceLastOpComponent } from './table-cell-service-last-op.component'; diff --git a/src/frontend/packages/core/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 similarity index 79% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-last-op/table-cell-service-last-op.component.ts rename to 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 6146a2da25..5d545f0a67 100644 --- a/src/frontend/packages/core/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,9 +1,9 @@ import { Component, Input, OnInit } from '@angular/core'; -import { userProvidedServiceInstanceEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; +import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { IServiceInstance } from '../../../../../../core/cf-api-svc.types'; -import { TableCellCustom } from '../../../list.types'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; +import { userProvidedServiceInstanceEntityType } from '../../../../../../cf-entity-types'; @Component({ selector: 'app-table-cell-service-last-op', diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.html diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.scss diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts similarity index 87% rename from src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts index 6ae314b013..f0977104c0 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.spec.ts @@ -6,8 +6,10 @@ import { import { generateCfBaseTestModulesNoShared, } from '../../../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; +import { + BooleanIndicatorComponent, +} from '../../../../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { BooleanIndicatorComponent } from '../../../../boolean-indicator/boolean-indicator.component'; import { ServiceInstanceLastOpComponent } from '../../../../service-instance-last-op/service-instance-last-op.component'; import { TableCellServiceComponent } from './table-cell-service.component'; @@ -33,11 +35,11 @@ describe('TableCellServiceComponent', () => { component = fixture.componentInstance; component.row = { entity: { - service_plan_guid: '', + service_plan_guid: 'service_plan_guid', space_guid: '', dashboard_url: '', type: '', - service_guid: '', + service_guid: 'service_guid', service_plan_url: '', service_bindings_url: '', service_keys_url: '', @@ -46,7 +48,7 @@ describe('TableCellServiceComponent', () => { }, metadata: { created_at: '', - guid: '', + guid: 'guid', updated_at: '', url: '' } 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 new file mode 100644 index 0000000000..80434fe3b8 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts @@ -0,0 +1,65 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { filter, first, map, switchMap } from 'rxjs/operators'; + +import { cfEntityCatalog } from '../../../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { userProvidedServiceInstanceEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../../../../../../../../cloud-foundry/src/cf-types'; +import { getServiceName } from '../../../../../../../../cloud-foundry/src/features/service-catalog/services-helper'; +import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; +import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; + +@Component({ + selector: 'app-table-cell-service', + templateUrl: './table-cell-service.component.html', + styleUrls: ['./table-cell-service.component.scss'] +}) +export class TableCellServiceComponent extends TableCellCustom> implements OnInit { + + serviceName$: Observable; + serviceUrl$: Observable; + serviceBrokerName$: Observable; + // tslint:disable-next-line:ban-types + isUserProvidedServiceInstance: Boolean; + + @Input() row: APIResource; + @Input() entityKey: string; + + + ngOnInit() { + this.isUserProvidedServiceInstance = + this.entityKey === entityCatalog.getEntityKey(CF_ENDPOINT_TYPE, userProvidedServiceInstanceEntityType); + + if (!this.isUserProvidedServiceInstance) { + const service$ = cfEntityCatalog.service.store.getEntityService(this.row.entity.service_guid, this.row.entity.cfGuid, {}) + .waitForEntity$.pipe( + filter(s => !!s), + ); + + this.serviceName$ = service$.pipe( + map(s => getServiceName(s.entity)) + ); + + this.serviceUrl$ = this.isUserProvidedServiceInstance ? of(null) : service$.pipe( + map(service => `/marketplace/${service.entity.entity.cfGuid}/${service.entity.metadata.guid}/summary`) + ); + + this.serviceBrokerName$ = service$.pipe( + first(), + switchMap(service => { + const brokerGuid = service.entity.entity.service_broker_guid; + return cfEntityCatalog.serviceBroker.store.getEntityService(brokerGuid, service.entity.entity.cfGuid, {}) + .waitForEntity$.pipe( + map(a => a.entity), + filter(res => !!res), + map(a => a.entity.name), + first() + ); + }) + ); + } + } + +} 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 b0351f346c..9c4debc316 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,9 +1,9 @@ import { Component, Input, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { IServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-space-name', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.spec.ts index 8ed58476df..5d3228031f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-space-card/cf-space-card.component.spec.ts @@ -1,16 +1,13 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; +import { testSessionData } from '@stratos/store/testing'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { - CloudFoundryUserProvidedServicesService, -} from '../../../../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; import { MetadataCardTestComponents } from '../../../../../../../../core/test-framework/core-test.helper'; -import { testSessionData } from '@stratos/store/testing'; import { VerifiedSession } from '../../../../../../../../store/src/actions/auth.actions'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; +import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfBaseTestModulesNoShared, generateTestCfEndpointServiceProvider, @@ -20,6 +17,9 @@ import { CloudFoundryOrganizationService, } from '../../../../../../features/cloud-foundry/services/cloud-foundry-organization.service'; import { CfOrgSpaceDataService } from '../../../../../data-services/cf-org-space-service.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../services/cloud-foundry-user-provided-services.service'; import { CfSpaceCardComponent } from './cf-space-card.component'; describe('CfSpaceCardComponent', () => { 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 9a9452fa8e..5d5886c3bb 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 @@ -6,11 +6,9 @@ import { map, switchMap, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { spaceEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { ISpaceFavMetadata } from '../../../../../../../../cloud-foundry/src/cf-metadata-types'; -import { IApp, ISpace } from '../../../../../../../../core/src/core/cf-api.types'; -import { getStartedAppInstanceCount } from '../../../../../../../../core/src/core/cf.helpers'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; -import { getFavoriteFromCfEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../../../core/src/core/user-favorite-helpers'; import { truthyIncludingZeroString } from '../../../../../../../../core/src/core/utils.service'; import { ConfirmationDialogConfig } from '../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; @@ -21,14 +19,17 @@ import { MetaCardMenuItem, } from '../../../../../../../../core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../../../../core/src/shared/shared.types'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; +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'; import { EndpointUser } from '../../../../../../../../store/src/types/endpoint.types'; import { UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; +import { IApp, ISpace } from '../../../../../../cf-api.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; +import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { getStartedAppInstanceCount } from '../../../../../../cf.helpers'; import { getSpaceRolesString } from '../../../../../../features/cloud-foundry/cf.helpers'; import { CloudFoundryEndpointService, @@ -80,7 +81,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 = getFavoriteFromCfEntity(this.row, spaceEntityType, this.favoritesConfigMapper); + this.favorite = getFavoriteFromEntity(this.row, spaceEntityType, this.favoritesConfigMapper, 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-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts index 21e1121ab9..87417ff379 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -15,20 +16,17 @@ import { } 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 { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; export class CfSpacesDataSourceService extends ListDataSource { constructor(cfGuid: string, orgGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(organizationEntityType, orgGuid); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const getAllSpaceActionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const action = getAllSpaceActionBuilder(orgGuid, cfGuid, paginationKey, [ - createEntityRelationKey(spaceEntityType, spaceQuotaEntityType), - ]) as PaginatedAction; + const action = cfEntityCatalog.space.actions.getAllInOrganization(orgGuid, cfGuid, paginationKey, { + includeRelations: [ + createEntityRelationKey(spaceEntityType, spaceQuotaEntityType), + ] + }); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.ts index 41dd14a73b..4571a58385 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-list-config.service.ts @@ -2,11 +2,11 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { ISpace } from '../../../../../../../core/src/core/cf-api.types'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { IListConfig, 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 { ISpace } from '../../../../../cf-api.types'; import { CloudFoundryOrganizationService, } from '../../../../../features/cloud-foundry/services/cloud-foundry-organization.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts index 1a0c89eab6..d4b5816219 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts @@ -1,24 +1,19 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.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 { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { stackEntityType } from '../../../../../cf-entity-types'; -import { StackActionBuilders } from '../../../../../entity-action-builders/stack-action-builders'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfStacksDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { - const stackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, stackEntityType); - const getAllStacksActionBuilder = stackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = getAllStacksActionBuilder(null, cfGuid); + const action = cfEntityCatalog.stack.actions.getMultiple(null, cfGuid); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-data-source.service.ts index 9e4928567e..a922ee27b8 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-data-source.service.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { GetAllOrganizationSpacesWithOrgs } from '../../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; @@ -7,15 +8,16 @@ import { organizationEntityType, spaceEntityType, } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { CfRolesService } from '../../../../../features/cloud-foundry/users/manage-users/cf-roles.service'; import { createEntityRelationKey } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { ListDataSource } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; -import { ISpace } from '../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; +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 { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { ISpace } from '../../../../../cf-api.types'; +import { CfRolesService } from '../../../../../features/cloud-foundry/users/manage-users/cf-roles.service'; export class CfUsersSpaceRolesDataSourceService extends ListDataSource> { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-list-config.service.ts index 9f2cabb6aa..17f384dd8c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/cf-users-space-roles-list-config.service.ts @@ -4,13 +4,13 @@ import { first } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { SpaceUserRoleNames } from '../../../../../../../cloud-foundry/src/store/types/user.types'; -import { ISpace } from '../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { IListConfig, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { selectUsersRolesRoles } from '../../../../../../../store/src/selectors/users-roles.selector'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { ISpace } from '../../../../../cf-api.types'; import { CfUsersSpaceRolesDataSourceService } from './cf-users-space-roles-data-source.service'; import { TableCellRoleOrgSpaceComponent } from './table-cell-org-space-role/table-cell-org-space-role.component'; @@ -42,6 +42,7 @@ export class CfUsersSpaceRolesListConfigService implements IListConfig 'Manager', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: SpaceUserRoleNames.MANAGER, isSpace: true @@ -50,6 +51,7 @@ export class CfUsersSpaceRolesListConfigService implements IListConfig 'Auditor', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: SpaceUserRoleNames.AUDITOR, isSpace: true @@ -58,6 +60,7 @@ export class CfUsersSpaceRolesListConfigService implements IListConfig 'Developer', cellComponent: TableCellRoleOrgSpaceComponent, + class: 'app-table__cell--table-column-additional-padding', cellConfig: { role: SpaceUserRoleNames.DEVELOPER, isSpace: true diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.spec.ts index c25d5da480..7fe7843b9a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.spec.ts @@ -1,18 +1,18 @@ +import { HttpClientModule } from '@angular/common/http'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ISpace } from '../../../../../../../../core/src/core/cf-api.types'; import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfUserServiceTestProvider } from '../../../../../../../../core/test-framework/user-service-helper'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { CfUserServiceTestProvider } from '../../../../../../../test-framework/user-service-helper'; +import { ISpace } from '../../../../../../cf-api.types'; import { ActiveRouteCfOrgSpace } from '../../../../../../features/cloud-foundry/cf-page.types'; import { CfRolesService } from '../../../../../../features/cloud-foundry/users/manage-users/cf-roles.service'; import { CfRoleCheckboxComponent } from '../../../../cf-role-checkbox/cf-role-checkbox.component'; import { TableCellRoleOrgSpaceComponent } from './table-cell-org-space-role.component'; -import { HttpClientModule } from '@angular/common/http'; describe('TableCellSpaceRoleComponent', () => { let component: TableCellRoleOrgSpaceComponent; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.ts index 9ff2fe14c9..0dcea0d3fb 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users-org-space-roles/table-cell-org-space-role/table-cell-org-space-role.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core'; -import { ISpace } from '../../../../../../../../core/src/core/cf-api.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { ISpace } from '../../../../../../cf-api.types'; @Component({ selector: 'app-table-cell-org-space-role', 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.spec.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.spec.ts index d1c65811b8..cd24bca07c 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.spec.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.spec.ts @@ -1,3 +1,4 @@ +import { HttpClientModule } from '@angular/common/http'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -5,12 +6,11 @@ import { CoreModule } from '../../../../../../../../core/src/core/core.module'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfStoreModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; -import { CfUserServiceTestProvider } from '../../../../../../../../core/test-framework/user-service-helper'; +import { CfUserServiceTestProvider } from '../../../../../../../test-framework/user-service-helper'; import { ActiveRouteCfOrgSpace } from '../../../../../../features/cloud-foundry/cf-page.types'; import { CfRolesService } from '../../../../../../features/cloud-foundry/users/manage-users/cf-roles.service'; import { CfUserService } from '../../../../../data-services/cf-user.service'; import { TableCellSelectOrgComponent } from './table-cell-select-org.component'; -import { HttpClientModule } from '@angular/common/http'; describe('TableCellSelectOrgComponent', () => { let component: TableCellSelectOrgComponent; 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 63c7dff469..1f8f147977 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 @@ -5,10 +5,10 @@ import { first, map } from 'rxjs/operators'; import { UsersRolesSetOrg } from '../../../../../../../../cloud-foundry/src/actions/users-roles.actions'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { IOrganization } from '../../../../../../../../core/src/core/cf-api.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { selectUsersRolesOrgGuid } from '../../../../../../../../store/src/selectors/users-roles.selector'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IOrganization } from '../../../../../../cf-api.types'; import { ActiveRouteCfOrgSpace } from '../../../../../../features/cloud-foundry/cf-page.types'; import { CfRolesService } from '../../../../../../features/cloud-foundry/users/manage-users/cf-roles.service'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts index 39545b54a2..f28255ba44 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts @@ -11,14 +11,14 @@ import { IUserPermissionInOrg, OrgUserRoleNames, } from '../../../../../../../../cloud-foundry/src/store/types/user.types'; -import { IOrganization } from '../../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; import { arrayHelper } from '../../../../../../../../core/src/core/helper-classes/array.helper'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IOrganization } from '../../../../../../cf-api.types'; import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { getOrgRoles } from '../../../../../../features/cloud-foundry/cf.helpers'; import { CfUserService } from '../../../../../data-services/cf-user.service'; @@ -36,7 +36,7 @@ export class CfOrgPermissionCellComponent extends CfPermissionCell, cfUserService: CfUserService, private userPerms: CurrentUserPermissionsService, - confirmDialog: ConfirmationDialogService + confirmDialog: ConfirmationDialogService, ) { super(store, confirmDialog, cfUserService); this.chipsConfig$ = combineLatest( @@ -74,8 +74,7 @@ export class CfOrgPermissionCellComponent extends CfPermissionCell extends IUserRole { spaceGuid?: string; } +@Directive() export abstract class CfPermissionCell extends TableCellCustom> { userEntity: BehaviorSubject = new BehaviorSubject(null); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component.ts index 8da4cdbc59..b03582d3f8 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-space-permission-cell/cf-space-permission-cell.component.ts @@ -12,13 +12,13 @@ import { IUserPermissionInSpace, SpaceUserRoleNames, } from '../../../../../../../../cloud-foundry/src/store/types/user.types'; -import { IOrganization, ISpace } from '../../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; import { arrayHelper } from '../../../../../../../../core/src/core/helper-classes/array.helper'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IOrganization, ISpace } from '../../../../../../cf-api.types'; import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { getSpaceRoles } from '../../../../../../features/cloud-foundry/cf.helpers'; import { CfUserService } from '../../../../../data-services/cf-user.service'; @@ -38,7 +38,7 @@ export class CfSpacePermissionCellComponent extends CfPermissionCell, cfUserService: CfUserService, private userPerms: CurrentUserPermissionsService, - confirmDialog: ConfirmationDialogService + confirmDialog: ConfirmationDialogService, ) { super(store, confirmDialog, cfUserService); @@ -130,8 +130,7 @@ export class CfSpacePermissionCellComponent extends CfPermissionCell boolean): diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.spec.ts index c19f06a636..33f477573a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.spec.ts @@ -10,8 +10,8 @@ import { } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { CloudFoundryOrganizationServiceMock, -} from '../../../../../../../core/test-framework/cloud-foundry-organization.service.mock'; -import { CloudFoundrySpaceServiceMock } from '../../../../../../../core/test-framework/cloud-foundry-space.service.mock'; +} from '../../../../../../test-framework/cloud-foundry-organization.service.mock'; +import { CloudFoundrySpaceServiceMock } from '../../../../../../test-framework/cloud-foundry-space.service.mock'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { CloudFoundryOrganizationService, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.ts index 4eab25e436..f070370166 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-user-list-config.service.ts @@ -7,7 +7,6 @@ import { UsersRolesSetUsers } from '../../../../../../../cloud-foundry/src/actio import { GetAllUsersAsAdmin } from '../../../../../../../cloud-foundry/src/actions/users.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { CfUser } from '../../../../../../../cloud-foundry/src/store/types/user.types'; -import { IOrganization, ISpace } from '../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsChecker } from '../../../../../../../core/src/core/current-user-permissions.checker'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; import { ITableColumn, ITableText } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; @@ -19,10 +18,11 @@ import { ListViewTypes, } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { SetClientFilter } from '../../../../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectPaginationState } from '../../../../../../../store/src/selectors/pagination.selectors'; import { APIResource, EntityInfo } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { IOrganization, ISpace } from '../../../../../cf-api.types'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { canUpdateOrgSpaceRoles, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-data-source.ts index 6006fc1d0a..6005c3711a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-data-source.ts @@ -1,27 +1,34 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { + createEntityRelationKey, createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { serviceBindingEntityType, serviceBindingNoBindingsEntityType } from '../../../../../cf-entity-types'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; +import { + applicationEntityType, + serviceBindingEntityType, + serviceBindingNoBindingsEntityType, +} from '../../../../../cf-entity-types'; export class DetachAppsDataSource extends ListDataSource { constructor(cfGuid: string, serviceInstanceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceBindingEntityType, serviceInstanceGuid); - const serviceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = serviceBindingEntity.actionOrchestrator.getActionBuilder('getAllForServiceInstance'); - const getAppServiceBindingsAction = actionBuilder(serviceInstanceGuid, cfGuid, paginationKey) as PaginatedAction; + const getAppServiceBindingsAction = cfEntityCatalog.serviceBinding.actions.getAllForServiceInstance( + serviceInstanceGuid, cfGuid, paginationKey, { + includeRelations: [ + createEntityRelationKey(serviceBindingEntityType, applicationEntityType) + ] + } + ); super({ store, action: getAppServiceBindingsAction, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.spec.ts index 2468f3170a..ca08e27bfd 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.spec.ts @@ -1,5 +1,6 @@ import { DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; import { generateCfBaseTestModules } from '../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { DetachAppsListConfigService } from './detach-apps-list-config.service'; @@ -7,7 +8,20 @@ import { DetachAppsListConfigService } from './detach-apps-list-config.service'; describe('DetachAppsListConfigService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [DetachAppsListConfigService, DatePipe], + providers: [ + DetachAppsListConfigService, + DatePipe, { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { + serviceInstanceId: 'serviceInstanceId', + endpointId: 'endpointId' + } + } + } + }, + ], imports: [generateCfBaseTestModules()], }); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts index a3cc6ae5f2..732ddd84ca 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts @@ -3,11 +3,11 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { IServiceBinding } from '../../../../../../../core/src/core/cf-api-svc.types'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; import { IListConfig, 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 { IServiceBinding } from '../../../../../cf-api-svc.types'; import { CFAppState } from '../../../../../cf-app-state'; import { DetachAppsDataSource } from './detach-apps-data-source'; @@ -26,7 +26,7 @@ export class DetachAppsListConfigService implements IListConfig { columnId: 'appName', headerCell: () => 'App Name', cellDefinition: { - getValue: (row: APIResource) => `${row.entity.app.entity.name}` + valuePath: 'entity.app.entity.name' }, sort: { type: 'sort', @@ -46,8 +46,7 @@ export class DetachAppsListConfigService implements IListConfig { }, }]; - constructor(private store: Store, private activatedRoute: ActivatedRoute, private datePipe: DatePipe) { - + constructor(private store: Store, activatedRoute: ActivatedRoute, private datePipe: DatePipe) { const { serviceInstanceId, endpointId } = activatedRoute.snapshot.params; this.dataSource = new DetachAppsDataSource(endpointId, serviceInstanceId, this.store, this); } diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts similarity index 71% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts index c93962a412..7baf178ccd 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts @@ -2,17 +2,16 @@ import { Store } from '@ngrx/store'; import { of as observableOf } from 'rxjs'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; +import { cfEntityCatalog } from '../../../../../../../cloud-foundry/src/cf-entity-catalog'; import { CFEntitySchema } from '../../../../../../../cloud-foundry/src/cf-entity-schema-types'; import { gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cloud-foundry/src/cf-types'; import { GitMeta } from '../../../../../../../cloud-foundry/src/entity-action-builders/git-action-builder'; import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +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 { GitSCM } from '../../../../data-services/scm/scm'; -import { ListDataSource } from '../../data-sources-controllers/list-data-source'; -import { IListConfig } from '../../list.component.types'; - - export class GithubCommitsDataSource extends ListDataSource { store: Store; @@ -30,15 +29,12 @@ export class GithubCommitsDataSource extends ListDataSource { sha: string, commitSha?: string, ) { - const gitCommitEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitCommitEntityType); - const fetchCommitActionBuilder = gitCommitEntity.actionOrchestrator.getActionBuilder('getMultiple'); const gitMeta: GitMeta = { scm, projectName, commitSha: sha }; - const fetchCommitAction = fetchCommitActionBuilder(sha, null, gitMeta); - const action = fetchCommitAction; + const action = cfEntityCatalog.gitCommit.actions.getMultiple(sha, null, gitMeta); const paginationKey = action.paginationKey; const rowsState = observableOf(commitSha ? { [commitSha]: { diff --git a/src/frontend/packages/core/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 similarity index 77% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts index 9d8fbab53c..fbca27d4a5 100644 --- a/src/frontend/packages/core/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 @@ -13,17 +13,15 @@ import { StoreCFSettings, } from '../../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cloud-foundry/src/cf-types'; +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 { GitBranch, GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; +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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { GitSCM } from '../../../../data-services/scm/scm'; import { GitSCMService, GitSCMType } from '../../../../data-services/scm/scm.service'; -import { IListAction } from '../../list.component.types'; import { GithubCommitsDataSource } from './github-commits-data-source'; import { GithubCommitsListConfigServiceBase } from './github-commits-list-config-base.service'; @@ -103,7 +101,6 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi datePipe: DatePipe, private scmService: GitSCMService, private applicationService: ApplicationService, - private entityServiceFactory: EntityServiceFactory ) { super(store, datePipe); this.setGuids(); @@ -131,25 +128,19 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi const scmType = stratosProject.deploySource.scm || stratosProject.deploySource.type; this.scm = this.scmService.getSCM(scmType as GitSCMType); - const branchKey = `${scmType}-${this.projectName}-${stratosProject.deploySource.branch}`; - const gitBranchesEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitBranchesEntityType); - const fetchBranchesActionBuilder = gitBranchesEntity.actionOrchestrator.getActionBuilder('get'); - const fetchBranchesAction = fetchBranchesActionBuilder(this.projectName, this.cfGuid, { + cfEntityCatalog.gitBranch.store.getEntityService(undefined, undefined, { scm: this.scm, - projectName: this.projectName - }); - const gitBranchEntityService = this.entityServiceFactory.create( - branchKey, - fetchBranchesAction - ); - gitBranchEntityService.waitForEntity$.pipe( - first(), - ).subscribe(branch => { - this.branchName = branch.entity.name; - this.dataSource = new GithubCommitsDataSource( - this.store, this, this.scm, this.projectName, this.branchName, this.deployedCommitSha); - this.initialised.next(true); - }); + projectName: this.projectName, + branchName: stratosProject.deploySource.branch + }) + .waitForEntity$.pipe( + first(), + ).subscribe(branch => { + this.branchName = branch.entity.name; + this.dataSource = new GithubCommitsDataSource( + this.store, this, this.scm, this.projectName, this.branchName, this.deployedCommitSha); + this.initialised.next(true); + }); this.setDeployedCommitDetails(); }); diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts similarity index 75% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts index 18e7d8b678..f0446539cd 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.spec.ts @@ -2,14 +2,13 @@ import { CommonModule, DatePipe } from '@angular/common'; import { inject, TestBed } from '@angular/core/testing'; import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; +import { CoreModule } from '../../../../../../../core/src/core/core.module'; +import { SharedModule } from '../../../../../../../core/src/shared/shared.module'; +import { CoreTestingModule } from '../../../../../../../core/test-framework/core-test.modules'; +import { createBasicStoreModule } from '../../../../../../../store/testing/public-api'; import { ApplicationServiceMock } from '../../../../../../test-framework/application-service-helper'; -import { CoreTestingModule } from '../../../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; -import { CoreModule } from '../../../../../core/core.module'; -import { SharedModule } from '../../../../shared.module'; import { GithubCommitsListConfigServiceBase } from './github-commits-list-config-base.service'; -// TODO: Move this file to cf package - #3769 describe('GithubCommitsListConfigService', () => { beforeEach(() => { TestBed.configureTestingModule({ diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts similarity index 92% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts index cdae19f5bb..6f970a4250 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-base.service.ts @@ -5,8 +5,8 @@ import { BehaviorSubject } from 'rxjs'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; -import { ITableColumn } from '../../list-table/table.types'; -import { IListConfig, ListViewTypes } from '../../list.component.types'; +import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; +import { IListConfig, ListViewTypes } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { GithubCommitsDataSource } from './github-commits-data-source'; import { TableCellCommitAuthorComponent } from './table-cell-commit-author/table-cell-commit-author.component'; diff --git a/src/frontend/packages/core/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 similarity index 93% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/github-commits-list-config-deploy.service.ts index 85fe999819..569bcf6b38 100644 --- a/src/frontend/packages/core/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 @@ -6,8 +6,10 @@ import { filter, first, map } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { selectApplicationSource } from '../../../../../../../cloud-foundry/src/store/selectors/deploy-application.selector'; import { DeployApplicationSource } from '../../../../../../../cloud-foundry/src/store/types/deploy-application.types'; +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 { TableCellRadioComponent } from '../../list-table/table-cell-radio/table-cell-radio.component'; import { GithubCommitsDataSource } from './github-commits-data-source'; import { GithubCommitsListConfigServiceBase } from './github-commits-list-config-base.service'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.html diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.scss diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts similarity index 90% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts index 71827d0b5e..92e0e8de98 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.spec.ts @@ -1,6 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { BaseTestModulesNoShared } from '../../../../../../../test-framework/core-test.helper'; +import { BaseTestModulesNoShared } from '../../../../../../../../core/test-framework/core-test.helper'; import { GithubCommitAuthorComponent } from '../../../../github-commit-author/github-commit-author.component'; import { TableCellCommitAuthorComponent } from './table-cell-commit-author.component'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts similarity index 64% rename from src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts index e54e7b5698..76a1c7a4e1 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component.ts @@ -1,6 +1,6 @@ -import { Component, Input } from '@angular/core'; +import { Component } from '@angular/core'; -import { TableCellCustom } from '../../../list.types'; +import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; @Component({ selector: 'app-table-cell-commit-author', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts index 09bb9e0867..bd441ba537 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -12,19 +13,15 @@ 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 { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class ServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, serviceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); + const action = cfEntityCatalog.serviceInstance.actions.getMultiple(cfGuid, paginationKey); super({ store, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts index 2020eb9613..f659096dc7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts @@ -1,4 +1,5 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { @@ -10,19 +11,17 @@ import { createEntityRelationKey, createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { getRowMetadata } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; import { populateServicePlanExtraTyped, } from '../../../../../../../cloud-foundry/src/features/service-catalog/services-helper'; -import { IServicePlan } from '../../../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; 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 { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { IServicePlan } from '../../../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; export class ServicePlansDataSource extends ListDataSource> { @@ -34,9 +33,7 @@ export class ServicePlansDataSource extends ListDataSource { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component.ts index 3c64cb0a2b..54802f42da 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-extras/table-cell-service-plan-extras.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core'; -import { IServicePlan } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServicePlan } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-plan-extras', 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 668b779530..9c178e613e 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 @@ -1,8 +1,8 @@ import { Component, Input } from '@angular/core'; -import { IServicePlan } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServicePlan } from '../../../../../../cf-api-svc.types'; import { canShowServicePlanCosts } from '../../../../../../features/service-catalog/services-helper'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component.ts index 5177975a6b..fa675a2c14 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/table-cell-service-plan-public/table-cell-service-plan-public.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core'; -import { IServicePlan } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServicePlan } from '../../../../../../cf-api-svc.types'; @Component({ selector: 'app-table-cell-service-plan-public', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.spec.ts index 0b2af1db9c..a70c702fd5 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.spec.ts @@ -1,8 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - ServiceInstanceLastOpComponent, -} from '../../../../../../../../core/src/shared/components/service-instance-last-op/service-instance-last-op.component'; import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; @@ -10,6 +7,7 @@ import { generateCfBaseTestModules } from '../../../../../../../test-framework/c import { ServicesWallService } from '../../../../../../features/services/services/services-wall.service'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; import { CfOrgSpaceLinksComponent } from '../../../../cf-org-space-links/cf-org-space-links.component'; +import { ServiceInstanceLastOpComponent } from '../../../../service-instance-last-op/service-instance-last-op.component'; import { TableCellServiceBindableComponent, } from '../../cf-services/table-cell-service-bindable/table-cell-service-bindable.component'; @@ -111,7 +109,7 @@ describe('ServiceInstanceCardComponent', () => { extra: '', tags: [''], requires: [''], - service_broker_guid: '', + service_broker_guid: 'service_broker_guid', plan_updateable: 1, service_plans_url: '', service_plans: [], 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 9364faf37a..0d82e721ec 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 @@ -4,7 +4,6 @@ import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { serviceInstancesEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; @@ -12,10 +11,9 @@ import { MetaCardMenuItem, } from '../../../../../../../../core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { ComponentEntityMonitorConfig } from '../../../../../../../../core/src/shared/shared.types'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IServiceInstance } from '../../../../../../cf-api-svc.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { getServiceBrokerName, @@ -24,6 +22,7 @@ import { getServiceSummaryUrl, } from '../../../../../../features/service-catalog/services-helper'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; +import { CfOrgSpaceLabelService } from '../../../../../services/cf-org-space-label.service'; @Component({ selector: 'app-service-instance-card', @@ -86,7 +85,6 @@ export class ServiceInstanceCardComponent extends CardCell, private serviceActionHelperService: ServiceActionHelperService, private currentUserPermissionsService: CurrentUserPermissionsService, - private entityServiceFactory: EntityServiceFactory ) { super(); } @@ -113,7 +110,7 @@ export class ServiceInstanceCardComponent extends CardCell; - detach = () => { + private detach = () => { this.serviceActionHelperService.detachServiceBinding( this.serviceInstanceEntity.entity.service_bindings, this.serviceInstanceEntity.metadata.guid, @@ -122,13 +119,13 @@ export class ServiceInstanceCardComponent extends CardCell this.serviceActionHelperService.deleteServiceInstance( + private delete = () => this.serviceActionHelperService.deleteServiceInstance( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.name, this.serviceInstanceEntity.entity.cfGuid ) - edit = () => this.serviceActionHelperService.editServiceBinding( + private edit = () => this.serviceActionHelperService.startEditServiceBindingStepper( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.cfGuid, null diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts index 57ffd72bc7..0ee25d9179 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts @@ -1,6 +1,6 @@ import { Store } from '@ngrx/store'; +import { getRowMetadata } from '@stratos/store'; -import { GetAllUserProvidedServices } from '../../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { serviceInstancesEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -14,24 +14,17 @@ import { ListPaginationMultiFilterChange, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction, PaginationParam } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../../../../entity-action-builders/service-instance.action.builders'; -import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; export class ServiceInstancesWallDataSource extends CFListDataSource { constructor(store: Store, transformEntities: any[], listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType); - const serviceInstanceEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const marketplaceAction = actionBuilder(null, paginationKey); - const userProvidedAction = new GetAllUserProvidedServices(); + const marketplaceAction = cfEntityCatalog.serviceInstance.actions.getMultiple(null, paginationKey); + const userProvidedAction = cfEntityCatalog.userProvidedService.actions.getMultiple(); const actionSchemaConfigs = [ new ActionSchemaConfig( marketplaceAction 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.spec.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.spec.ts index 29ee3c45b1..b29953ba7f 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.spec.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.spec.ts @@ -3,11 +3,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; -import { - generateCfBaseTestModules, -} from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; +import { generateCfBaseTestModules } from '../../../../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { ServicesWallService } from '../../../../../../features/services/services/services-wall.service'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../../../../services/cloud-foundry-user-provided-services.service'; import { CfOrgSpaceLinksComponent } from '../../../../cf-org-space-links/cf-org-space-links.component'; import { UserProvidedServiceInstanceCardComponent } from './user-provided-service-instance-card.component'; @@ -25,6 +26,7 @@ describe('UserProvidedServiceInstanceCardComponent', () => { EntityMonitorFactory, PaginationMonitorFactory, ServiceActionHelperService, + CloudFoundryUserProvidedServicesService, ] }) .compileComponents(); 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 e21657ecd0..886f8d976d 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 @@ -4,7 +4,6 @@ import { BehaviorSubject, of as observableOf } from 'rxjs'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { userProvidedServiceInstanceEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; -import { IUserProvidedServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../../core/src/core/current-user-permissions.service'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; @@ -12,11 +11,12 @@ import { MetaCardMenuItem, } from '../../../../../../../../core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { ComponentEntityMonitorConfig } from '../../../../../../../../core/src/shared/shared.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; +import { IUserProvidedServiceInstance } from '../../../../../../cf-api-svc.types'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; import { ServiceActionHelperService } from '../../../../../data-services/service-action-helper.service'; +import { CfOrgSpaceLabelService } from '../../../../../services/cf-org-space-label.service'; @Component({ @@ -98,7 +98,7 @@ export class UserProvidedServiceInstanceCardComponent extends CardCell { + private detach = () => { this.serviceActionHelperService.detachServiceBinding( this.serviceInstanceEntity.entity.service_bindings, this.serviceInstanceEntity.metadata.guid, @@ -108,14 +108,14 @@ export class UserProvidedServiceInstanceCardComponent extends CardCell this.serviceActionHelperService.deleteServiceInstance( + private delete = () => this.serviceActionHelperService.deleteServiceInstance( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.name, this.serviceInstanceEntity.entity.cfGuid, true ) - edit = () => this.serviceActionHelperService.editServiceBinding( + private edit = () => this.serviceActionHelperService.startEditServiceBindingStepper( this.serviceInstanceEntity.metadata.guid, this.serviceInstanceEntity.entity.cfGuid, null, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts index 1d663a7458..29614fb734 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts @@ -2,9 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { GetAppStatsAction } from '../../../../../cloud-foundry/src/actions/app-metadata.actions'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { AppStat } from '../../../store/types/app-metadata.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; @Component({ selector: 'app-running-instances', @@ -19,16 +17,8 @@ export class RunningInstancesComponent implements OnInit { // Observable on the running instances count for the application public runningInstances$: Observable; - constructor(private paginationMonitorFactory: PaginationMonitorFactory) { } - ngOnInit() { - const dummyAction = new GetAppStatsAction(this.appGuid, this.cfGuid); - const paginationMonitor = this.paginationMonitorFactory.create( - dummyAction.paginationKey, - dummyAction, - dummyAction.flattenPagination - ); - this.runningInstances$ = paginationMonitor.currentPage$.pipe( + this.runningInstances$ = cfEntityCatalog.appStats.store.getPaginationMonitor(this.appGuid, this.cfGuid).currentPage$.pipe( map(appInstancesPages => { const allInstances = [].concat.apply([], Object.values(appInstancesPages || [])).filter(instance => !!instance); return allInstances.filter(stat => stat.state === 'RUNNING').length; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.spec.ts index 0a9036194e..047a72ebe7 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/schema-form/schema-form.component.spec.ts @@ -1,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MaterialDesignFrameworkModule } from 'stratos-angular6-json-schema-form'; +import { MaterialDesignFrameworkModule } from '@cfstratos/ajsf-material'; import { generateCfBaseTestModulesNoShared } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import { SchemaFormComponent } from './schema-form.component'; 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 296555d433..ab7ea7ac55 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 @@ -3,7 +3,7 @@ import { FormControl, FormGroup } from '@angular/forms'; import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { delay } from 'rxjs/operators'; -import { JsonPointer } from 'stratos-angular6-json-schema-form'; +import { JsonPointer } from '@cfstratos/ajsf-core'; import { safeStringToObj } from '../../../../../core/src/core/utils.service'; import { isValidJsonValidator } from '../../../../../core/src/shared/form-validators'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.spec.ts index 9355865ad3..9f62582f19 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.spec.ts @@ -1,6 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { ApplicationStateIconComponent, } from '../../../../../core/src/shared/components/application-state/application-state-icon/application-state-icon.component'; @@ -30,6 +29,7 @@ import { import { MultilineTitleComponent, } from '../../../../../core/src/shared/components/multiline-title/multiline-title.component'; +import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { generateCfBaseTestModulesNoShared } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.ts index c00320b4e5..501aba54d3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/select-service/select-service.component.ts @@ -4,11 +4,11 @@ import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { filter, map, switchMap, tap } from 'rxjs/operators'; -import { IService } from '../../../../../core/src/core/cf-api-svc.types'; import { StepOnNextResult } from '../../../../../core/src/shared/components/stepper/step/step.component'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource } from '../../../../../store/src/types/api.types'; import { SetCreateServiceInstanceServiceGuid } from '../../../actions/create-service-instance.actions'; +import { IService } from '../../../cf-api-svc.types'; import { CFAppState } from '../../../cf-app-state'; import { cfEntityFactory } from '../../../cf-entity-factory'; import { serviceEntityType } from '../../../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/service-icon/service-icon.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-icon/service-icon.component.ts index ca158f95af..18f23b8984 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/service-icon/service-icon.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-icon/service-icon.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnInit } from '@angular/core'; -import { IService, IServiceExtra } from '../../../../../core/src/core/cf-api-svc.types'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IService, IServiceExtra } from '../../../cf-api-svc.types'; @Component({ selector: 'app-service-icon', diff --git a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.html b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.html similarity index 100% rename from src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.html rename to src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.html diff --git a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.scss b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.scss similarity index 100% rename from src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.scss rename to src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.scss diff --git a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts similarity index 84% rename from src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts index 08d78f240a..9a29b6dc57 100644 --- a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.spec.ts @@ -1,7 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { BaseTestModulesNoShared } from '../../../../test-framework/core-test.helper'; -import { BooleanIndicatorComponent } from '../boolean-indicator/boolean-indicator.component'; +import { + BooleanIndicatorComponent, +} from '../../../../../core/src/shared/components/boolean-indicator/boolean-indicator.component'; +import { BaseTestModulesNoShared } from '../../../../../core/test-framework/core-test.helper'; import { ServiceInstanceLastOpComponent } from './service-instance-last-op.component'; describe('ServiceInstanceLastOpComponent', () => { diff --git a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts similarity index 80% rename from src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts rename to src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts index ba147899fb..6b61fd014b 100644 --- a/src/frontend/packages/core/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-instance-last-op/service-instance-last-op.component.ts @@ -1,9 +1,7 @@ import { Component, Input } from '@angular/core'; import { APIResource } from '../../../../../store/src/types/api.types'; -import { IServiceInstance } from '../../../core/cf-api-svc.types'; - -// TODO: Move CF code to CF Module #3769 +import { IServiceInstance } from '../../../cf-api-svc.types'; @Component({ selector: 'app-service-instance-last-op', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-price/service-plan-price.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-price/service-plan-price.component.ts index a811238323..43c493f1d9 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-price/service-plan-price.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-price/service-plan-price.component.ts @@ -2,8 +2,8 @@ import { registerLocaleData } from '@angular/common'; import localeFr from '@angular/common/locales/fr'; import { Component, Input } from '@angular/core'; -import { IServicePlan, IServicePlanCost } from '../../../../../core/src/core/cf-api-svc.types'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IServicePlan, IServicePlanCost } from '../../../cf-api-svc.types'; @Component({ diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.spec.ts index 017e056564..0ecf090c2a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.spec.ts @@ -1,14 +1,14 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { of } from 'rxjs'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; +import { EntityService } from '../../../../../store/src/entity-service'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { generateCfBaseTestModulesNoShared } from '../../../../test-framework/cloud-foundry-endpoint-service.helper'; import * as servicesHelpers from '../../../features/service-catalog/services-helper'; import { ServicesService } from '../../../features/service-catalog/services.service'; import { ServicesServiceMock } from '../../../features/service-catalog/services.service.mock'; import { ServicePlanPublicComponent } from './service-plan-public.component'; -import { EntityService } from '../../../../../store/src/entity-service'; const getCfService = { waitForEntity$: { @@ -69,24 +69,20 @@ describe('ServicePlanPublicComponent', () => { it('should display if service plan is reachable', () => { const planAccessibility$ = of(StratosStatus.WARNING); const s0 = spyOn(servicesHelpers, 'getServicePlanAccessibilityCardStatus').and.returnValue(planAccessibility$); - const s1 = spyOn(servicesHelpers, 'getCfService').and.returnValue(getCfService); component.servicePlan = servicesService.servicePlan; fixture.detectChanges(); expect(s0).toHaveBeenCalled(); - expect(s1).toHaveBeenCalled(); expect(element.textContent).toContain('Service Plan has limited visibility'); }); it('should display if service plan is not reachable', () => { const planAccessibility$ = of(StratosStatus.ERROR); const s0 = spyOn(servicesHelpers, 'getServicePlanAccessibilityCardStatus').and.returnValue(planAccessibility$); - const s1 = spyOn(servicesHelpers, 'getCfService').and.returnValue(getCfService); component.servicePlan = servicesService.servicePlan; fixture.detectChanges(); expect(s0).toHaveBeenCalled(); - expect(s1).toHaveBeenCalled(); expect(element.textContent).toContain('Service Plan has no visibility'); }); }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts index d50491f5fb..e4e4ba6ef9 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts @@ -3,15 +3,13 @@ import { Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { - getCfService, - getServiceBroker, getServicePlanAccessibilityCardStatus, } from '../../../../../cloud-foundry/src/features/service-catalog/services-helper'; import { ServicesService } from '../../../../../cloud-foundry/src/features/service-catalog/services.service'; -import { IServiceBroker, IServicePlan } from '../../../../../core/src/core/cf-api-svc.types'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { IServiceBroker, IServicePlan } from '../../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; @Component({ selector: 'app-service-plan-public', @@ -35,7 +33,7 @@ export class ServicePlanPublicComponent { } this.planAccessibility$ = getServicePlanAccessibilityCardStatus( servicePlan, - this.servicesService.getServicePlanVisibilities(), + this.servicesService.servicePlanVisibilities$, this.getServiceBroker(servicePlan.entity.service_guid, servicePlan.entity.cfGuid) ); this.planAccessibilityMessage$ = this.planAccessibility$.pipe( @@ -51,13 +49,12 @@ export class ServicePlanPublicComponent { constructor( private servicesService: ServicesService, - private entityServiceFactory: EntityServiceFactory ) { } private getServiceBroker(serviceGuid: string, cfGuid: string): Observable> { - return getCfService(serviceGuid, cfGuid, this.entityServiceFactory).waitForEntity$.pipe( - map(service => getServiceBroker(service.entity.entity.service_broker_guid, cfGuid, this.entityServiceFactory)), + return cfEntityCatalog.service.store.getEntityService(serviceGuid, cfGuid, {}).waitForEntity$.pipe( + map(service => cfEntityCatalog.serviceBroker.store.getEntityService(service.entity.entity.service_broker_guid, cfGuid, {})), switchMap(serviceService => serviceService.waitForEntity$), map(entity => entity.entity) ); 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 b24ccb35a1..75489373b1 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 @@ -17,7 +17,6 @@ import { import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; import { organizationEntityType, spaceEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { safeUnsubscribe } from '../../../../core/src/core/utils.service'; import { ListPaginationMultiFilterChange, @@ -26,18 +25,16 @@ import { valueOrCommonFalsy, } from '../../../../core/src/shared/components/list/data-sources-controllers/list-pagination-controller'; import { ResetPagination, SetParams } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { - getCurrentPageRequestInfo, - getPaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getCurrentPageRequestInfo } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; 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 { IOrganization, ISpace } from '../../cf-api.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { QParam, QParamJoiners } from '../q-param'; export function spreadPaginationParams(params: PaginationParam): PaginationParam { @@ -304,15 +301,12 @@ export class CfOrgSpaceDataService implements OnDestroy { } private createPaginationAction() { - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(null, CfOrgSpaceDataService.CfOrgSpaceServicePaginationKey, { + return cfEntityCatalog.org.actions.getMultiple(null, CfOrgSpaceDataService.CfOrgSpaceServicePaginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), ], populateMissing: true }); - return getAllOrganizationsAction; } public getEndpointOrgs(endpointGuid: string) { 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 706d2dfa56..e96d52510c 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 @@ -16,27 +16,24 @@ import { UserRoleInOrg, UserRoleInSpace, } from '../../../../cloud-foundry/src/store/types/user.types'; -import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { LocalPaginationHelpers, } from '../../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { getDefaultPaginationEntityState, } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination'; +import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { getCurrentPageRequestInfo, - getPaginationObservables, PaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource } from '../../../../store/src/types/api.types'; import { PaginatedAction } 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'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { UserActionBuilders } from '../../entity-action-builders/user.action-builders'; import { ActiveRouteCfOrgSpace } from '../../features/cloud-foundry/cf-page.types'; import { fetchTotalResults, @@ -56,15 +53,12 @@ import { selectCfPaginationState } from '../../store/selectors/pagination.select export class CfUserService { private allUsers$: Observable>>; - private userCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfUserEntityType); - users: { [guid: string]: Observable> } = {}; constructor( private store: Store, public paginationMonitorFactory: PaginationMonitorFactory, public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private entityServiceFactory: EntityServiceFactory, ) { } getUsers = (endpointGuid: string, filterEmpty = true): Observable[]> => @@ -114,15 +108,11 @@ export class CfUserService { return observableOf(users.filter(o => o.metadata.guid === userGuid)[0]); } if (!this.users[userGuid]) { - const actionBuilder = this.userCatalogEntity.actionOrchestrator.getActionBuilder('get'); - const getUserAction = actionBuilder(userGuid, endpointGuid); - this.users[userGuid] = this.entityServiceFactory.create>( - userGuid, - getUserAction - ).waitForEntity$.pipe( - filter(entity => !!entity), - map(entity => entity.entity) - ); + this.users[userGuid] = cfEntityCatalog.user.store.getEntityService(userGuid, endpointGuid) + .waitForEntity$.pipe( + filter(entity => !!entity), + map(entity => entity.entity) + ); } return this.users[userGuid]; }), @@ -458,11 +448,11 @@ export class CfUserService { } private createCfGetAllUsersAction = (cfGuid: string): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getMultiple')(cfGuid, null); + return cfEntityCatalog.user.actions.getMultiple(cfGuid, null); } private createOrgGetUsersAction = (isAdmin: boolean, cfGuid: string, orgGuid: string): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getAllInOrganization')( + return cfEntityCatalog.user.actions.getAllInOrganization( orgGuid, cfGuid, createEntityRelationPaginationKey(organizationEntityType, orgGuid), @@ -471,7 +461,7 @@ export class CfUserService { } private createSpaceGetUsersAction = (isAdmin: boolean, cfGuid: string, spaceGuid: string, ): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getAllInSpace')( + return cfEntityCatalog.user.actions.getAllInSpace( spaceGuid, cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid), diff --git a/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts similarity index 81% rename from src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts rename to src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts index 5de5a777ca..476eded13e 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/github-scm.ts @@ -2,8 +2,8 @@ import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { GitBranch, GitCommit, GitRepo } from '../../../../../cloud-foundry/src/store/types/git.types'; -import { getGitHubAPIURL } from '../../../core/github.helpers'; +import { getGitHubAPIURL } from '../../../../../core/src/core/github.helpers'; +import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; import { GitSCM, SCMIcon } from './scm'; import { GitSCMType } from './scm.service'; @@ -32,6 +32,10 @@ export class GitHubSCM implements GitSCM { 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 { return httpClient.get(`${this.gitHubURL}/repos/${projectName}/branches`) as Observable; } @@ -44,8 +48,8 @@ export class GitHubSCM implements GitSCM { return `${this.gitHubURL}/repos/${projectName}/commits/${commitSha}`; } - getCommits(httpClient: HttpClient, projectName: string, commitSha: string): Observable { - return httpClient.get(`${this.gitHubURL}/repos/${projectName}/commits?sha=${commitSha}`) as Observable; + getCommits(httpClient: HttpClient, projectName: string, ref: string): Observable { + return httpClient.get(`${this.gitHubURL}/repos/${projectName}/commits?sha=${ref}`) as Observable; } getCloneURL(projectName: string): string { diff --git a/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts similarity index 90% rename from src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts rename to src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts index 2b6daa1931..dacdc76916 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts @@ -3,7 +3,7 @@ import { Observable, of as observableOf } from 'rxjs'; import { map } from 'rxjs/operators'; import { Md5 } from 'ts-md5/dist/md5'; -import { GitBranch, GitCommit, GitRepo } from '../../../../../cloud-foundry/src/store/types/git.types'; +import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; import { GitSCM, SCMIcon } from './scm'; import { GitSCMType } from './scm.service'; @@ -46,6 +46,17 @@ export class GitLabSCM implements GitSCM { ); } + 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`).pipe( diff --git a/src/frontend/packages/core/src/shared/data-services/scm/scm.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.service.ts similarity index 91% rename from src/frontend/packages/core/src/shared/data-services/scm/scm.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.service.ts index 82e87ed2c8..99b116519f 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/scm.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.service.ts @@ -1,6 +1,6 @@ import { Inject, Injectable } from '@angular/core'; -import { GITHUB_API_URL } from '../../../core/github.helpers'; +import { GITHUB_API_URL } from '../../../../../core/src/core/github.helpers'; import { GitHubSCM } from './github-scm'; import { GitLabSCM } from './gitlab-scm'; import { GitSCM } from './scm'; diff --git a/src/frontend/packages/core/src/shared/data-services/scm/scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.ts similarity index 85% rename from src/frontend/packages/core/src/shared/data-services/scm/scm.ts rename to src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.ts index eb25e03cb9..27aab218dd 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/scm.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/scm.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { GitBranch, GitCommit, GitRepo } from '../../../../../cloud-foundry/src/store/types/git.types'; +import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; import { GitSCMType } from './scm.service'; export interface SCMIcon { @@ -15,6 +15,7 @@ export interface GitSCM { getLabel(): string; getIcon(): SCMIcon; getRepository(httpClient: HttpClient, projectName: string): Observable; + getBranch(httpClient: HttpClient, projectName: string, branchId: string): Observable; getBranches(httpClient: HttpClient, projectName: string): Observable; getCommit(httpClient: HttpClient, projectName: string, commitSha: string): Observable; getCommits(httpClient: HttpClient, projectName: string, commitSha: string): Observable; diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts index 349c1928cb..d4302afc75 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts @@ -3,29 +3,18 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { filter, first, map, pairwise } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { - DeleteUserProvidedInstance, - UpdateUserProvidedServiceInstance, -} from '../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - serviceBindingEntityType, - serviceInstancesEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; -import { IServiceBinding, IServiceInstance, IUserProvidedServiceInstance } from '../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata, EntityCatalogEntityConfig } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; +import { serviceInstancesEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { ConfirmationDialogConfig } from '../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; import { RouterNav, RouterQueryParams } from '../../../../store/src/actions/router.actions'; +import { EntityCatalogEntityConfig } from '../../../../store/src/entity-catalog/entity-catalog.types'; +import { EntityService } from '../../../../store/src/entity-service'; import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; -import { APIResource, EntityInfo } from '../../../../store/src/types/api.types'; -import { UpdateServiceInstance } from '../../actions/service-instances.actions'; -import { ServiceBindingActionBuilders } from '../../entity-action-builders/service-binding.action-builders'; -import { ServiceInstanceActionBuilders } from '../../entity-action-builders/service-instance.action.builders'; +import { APIResource } from '../../../../store/src/types/api.types'; +import { IServiceBinding } from '../../cf-api-svc.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { SERVICE_INSTANCE_TYPES, } from '../components/add-service-instance/add-service-instance-base-step/add-service-instance.types'; @@ -34,20 +23,9 @@ import { @Injectable() export class ServiceActionHelperService { - private sgEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceBindingEntityType - ); - - private serviceInstanceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceInstancesEntityType - ); - constructor( private confirmDialog: ConfirmationDialogService, private store: Store, - private entityServiceFactory: EntityServiceFactory ) { } detachServiceBinding = ( @@ -65,8 +43,7 @@ export class ServiceActionHelperService { return; } - const actionBuilder = this.sgEntity.actionOrchestrator.getActionBuilder('remove'); - const action = actionBuilder(serviceBindings[0].metadata.guid, endpointGuid, { serviceInstanceGuid }); + const action = cfEntityCatalog.serviceBinding.actions.remove(serviceBindings[0].metadata.guid, endpointGuid, { serviceInstanceGuid }); if (!noConfirm) { const confirmation = new ConfirmationDialogConfig( 'Detach Service Instance', @@ -94,8 +71,8 @@ export class ServiceActionHelperService { }; const action = userProvided ? - new DeleteUserProvidedInstance(endpointGuid, serviceInstanceGuid, serviceInstancesEntityConfig) : - this.serviceInstanceEntity.actionOrchestrator.getActionBuilder('remove')(serviceInstanceGuid, endpointGuid); + cfEntityCatalog.userProvidedService.actions.remove(serviceInstanceGuid, endpointGuid, serviceInstancesEntityConfig) : + cfEntityCatalog.serviceInstance.actions.remove(serviceInstanceGuid, endpointGuid); const confirmation = new ConfirmationDialogConfig( 'Delete Service Instance', @@ -109,7 +86,7 @@ export class ServiceActionHelperService { } - editServiceBinding = ( + startEditServiceBindingStepper = ( guid: string, endpointGuid: string, query: RouterQueryParams = {}, @@ -122,17 +99,13 @@ export class ServiceActionHelperService { } )); - const obs: Observable> = userProvided ? - this.createUserProvidedServiceInstanceObs(guid, endpointGuid) : - this.createServiceInstanceObs(guid, endpointGuid); + const es: EntityService = userProvided ? + cfEntityCatalog.userProvidedService.store.getEntityService(guid, endpointGuid, {}) : + cfEntityCatalog.serviceInstance.store.getEntityService(guid, endpointGuid); - const updatingKey = userProvided ? - UpdateUserProvidedServiceInstance.updateServiceInstance : - UpdateServiceInstance.updateServiceInstance; - - return obs.pipe( + return es.entityObs$.pipe( filter(res => !!res), - map(res => res.entityRequestInfo.updating[updatingKey]), + map(res => res.entityRequestInfo.updating[es.action.updatingKey]), filter(res => !!res), pairwise(), filter(([oldV, newV]) => oldV.busy && !newV.busy), @@ -144,25 +117,4 @@ export class ServiceActionHelperService { private getRouteKey(userProvided: boolean) { return userProvided ? SERVICE_INSTANCE_TYPES.USER_SERVICE : SERVICE_INSTANCE_TYPES.SERVICE; } - - private createUserProvidedServiceInstanceObs(guid: string, endpointGuid: string): - Observable>> { - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, userProvidedServiceInstanceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('get'); - const getUserProvidedServiceAction = actionBuilder(guid, endpointGuid); - return this.entityServiceFactory.create>( - guid, - getUserProvidedServiceAction - ).entityObs$; - } - - private createServiceInstanceObs(guid: string, endpointGuid: string): Observable>> { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(guid, endpointGuid); - return this.entityServiceFactory.create>( - guid, - getServiceInstanceAction - ).entityObs$; - } } diff --git a/src/frontend/packages/core/src/shared/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 similarity index 66% rename from src/frontend/packages/core/src/shared/app-name-unique.directive/app-name-unique.directive.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.spec.ts index d7ce7bfa7b..d19c066a77 100644 --- a/src/frontend/packages/core/src/shared/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 @@ -7,17 +7,18 @@ import { RouterTestingModule } from '@angular/router/testing'; import { Store } from '@ngrx/store'; import { createBasicStoreModule } from '@stratos/store/testing'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { ActiveRouteCfOrgSpace } from '../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { CfUserService } from '../../../../cloud-foundry/src/shared/data-services/cf-user.service'; -import { AppStoreModule } from '../../../../store/src/store.module'; -import { CoreTestingModule } from '../../../test-framework/core-test.modules'; -import { CoreModule } from '../../core/core.module'; -import { ExtensionService } from '../../core/extension/extension-service'; -import { getGitHubAPIURL, GITHUB_API_URL } from '../../core/github.helpers'; -import { SharedModule } from '../shared.module'; +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 { AppStoreModule } from '../../../../../store/src/store.module'; +import { CFAppState } from '../../../cf-app-state'; +import { ActiveRouteCfOrgSpace } from '../../../features/cloud-foundry/cf-page.types'; +import { CfUserService } from '../../data-services/cf-user.service'; import { AppNameUniqueDirective } from './app-name-unique.directive'; + describe('AppNameUniqueDirective', () => { beforeEach(() => { diff --git a/src/frontend/packages/core/src/shared/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 similarity index 94% rename from src/frontend/packages/core/src/shared/app-name-unique.directive/app-name-unique.directive.ts rename to src/frontend/packages/cloud-foundry/src/shared/directives/app-name-unique.directive/app-name-unique.directive.ts index 7244df86a2..eab0dac1b9 100644 --- a/src/frontend/packages/core/src/shared/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 @@ -5,10 +5,9 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf, throwError as observableThrowError, timer as observableTimer } from 'rxjs'; import { catchError, filter, map, switchMap, take } from 'rxjs/operators'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { selectNewAppState } from '../../../../cloud-foundry/src/store/effects/create-app-effects'; -import { environment } from '../../environments/environment.prod'; - +import { CFAppState } from '../../../cf-app-state'; +import { environment } from './../../../../../core/src/environments/environment.prod'; +import { selectNewAppState } from './../../../store/effects/create-app-effects'; /* tslint:disable:no-use-before-declare */ const APP_UNIQUE_NAME_PROVIDER = { diff --git a/src/frontend/packages/cloud-foundry/src/shared/q-param.ts b/src/frontend/packages/cloud-foundry/src/shared/q-param.ts index 9ef97937e5..d179deaeb0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/q-param.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/q-param.ts @@ -23,7 +23,7 @@ export class QParam { return new QParam( qParamComponents[0], qParamComponents[1], - qParamComponents[2] + QParamJoiners[qParamComponents[2]] ); } return null; diff --git a/src/frontend/packages/core/src/shared/components/application-state/application-state.service.spec.ts b/src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.spec.ts similarity index 100% rename from src/frontend/packages/core/src/shared/components/application-state/application-state.service.spec.ts rename to src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.spec.ts diff --git a/src/frontend/packages/core/src/shared/components/application-state/application-state.service.ts b/src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.ts similarity index 97% rename from src/frontend/packages/core/src/shared/components/application-state/application-state.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.ts index f9ac1d84c8..751994c0f0 100644 --- a/src/frontend/packages/core/src/shared/components/application-state/application-state.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/services/application-state.service.ts @@ -1,12 +1,9 @@ import { Injectable } from '@angular/core'; -import { AppStat } from '../../../../../cloud-foundry/src/store/types/app-metadata.types'; -import { StratosStatus } from '../../shared.types'; +import { StratosStatus, StratosStatusMetadata } from '../../../../core/src/shared/shared.types'; +import { AppStat } from '../../store/types/app-metadata.types'; -export interface ApplicationStateData { - label: string; - subLabel?: string; - indicator: StratosStatus; +export interface ApplicationStateData extends StratosStatusMetadata { actions: { [key: string]: boolean }; diff --git a/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts b/src/frontend/packages/cloud-foundry/src/shared/services/cf-org-space-label.service.ts similarity index 83% rename from src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts rename to src/frontend/packages/cloud-foundry/src/shared/services/cf-org-space-label.service.ts index 933441c5d6..585f41ed42 100644 --- a/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/services/cf-org-space-label.service.ts @@ -2,17 +2,17 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { filter, first, map } from 'rxjs/operators'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType, spaceEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; -import { haveMultiConnectedCfs } from '../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { selectCfEntity } from '../../../../cloud-foundry/src/store/selectors/api.selectors'; +import { STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../store/src/helpers/entity-factory'; import { selectEntity } from '../../../../store/src/selectors/api.selectors'; import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; -import { STRATOS_ENDPOINT_TYPE } from '../../base-entity-schemas'; -import { IOrganization, ISpace } from '../../core/cf-api.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { IOrganization, ISpace } from '../../cf-api.types'; +import { CFAppState } from '../../cf-app-state'; +import { organizationEntityType, spaceEntityType } from '../../cf-entity-types'; +import { haveMultiConnectedCfs } from '../../features/cloud-foundry/cf.helpers'; +import { selectCfEntity } from '../../store/selectors/api.selectors'; export class CfOrgSpaceLabelService { diff --git a/src/frontend/packages/cloud-foundry/src/shared/services/cloud-foundry-user-provided-services.service.ts b/src/frontend/packages/cloud-foundry/src/shared/services/cloud-foundry-user-provided-services.service.ts new file mode 100644 index 0000000000..a90fbb0a94 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/shared/services/cloud-foundry-user-provided-services.service.ts @@ -0,0 +1,111 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { combineLatest, Observable } from 'rxjs'; +import { filter, first, map, pairwise, tap } from 'rxjs/operators'; + +import { ClearPaginationOfType } from '../../../../store/src/actions/pagination.actions'; +import { EntityCatalogEntityConfig } from '../../../../store/src/entity-catalog/entity-catalog.types'; +import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; +import { ActionState, RequestInfoState } from '../../../../store/src/reducers/api-request-reducer/types'; +import { APIResource } from '../../../../store/src/types/api.types'; +import { + getUserProvidedServiceInstanceRelations, + IUserProvidedServiceInstanceData, +} from '../../actions/user-provided-service.actions'; +import { IUserProvidedServiceInstance } from '../../cf-api-svc.types'; +import { CFAppState } from '../../cf-app-state'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { organizationEntityType, spaceEntityType } from '../../cf-entity-types'; +import { createEntityRelationPaginationKey } from '../../entity-relations/entity-relations.types'; +import { fetchTotalResults } from '../../features/cloud-foundry/cf.helpers'; +import { QParam, QParamJoiners } from '../q-param'; + + +@Injectable() +export class CloudFoundryUserProvidedServicesService { + + constructor( + private store: Store, + private paginationMonitorFactory: PaginationMonitorFactory, + ) { + + } + + public getUserProvidedServices(cfGuid: string, spaceGuid?: string, relations = getUserProvidedServiceInstanceRelations) + : Observable[]> { + + const pagObs = cfEntityCatalog.userProvidedService.store.getAllInSpace.getPaginationService( + cfGuid, spaceGuid, null, relations, true + ); + return combineLatest([ + pagObs.entities$, // Ensure entities is subbed to the fetch kicks off + pagObs.fetchingEntities$ + ]).pipe( + filter(([, fetching]) => !fetching), + map(([entities]) => entities) + ); + } + + public fetchUserProvidedServiceInstancesCount(cfGuid: string, orgGuid?: string, spaceGuid?: string) + : Observable { + const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; + const uniqueKey = spaceGuid || orgGuid || cfGuid; + + const action = cfEntityCatalog.userProvidedService.actions.getMultiple( + createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), + cfGuid, + { includeRelations: [], populateMissing: false } + ); + action.initialParams.q = []; + if (orgGuid) { + action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); + } + if (spaceGuid) { + action.initialParams.q.push(new QParam('space_guid', spaceGuid, QParamJoiners.in).toString()); + } + return fetchTotalResults(action, this.store, this.paginationMonitorFactory); + } + + public getUserProvidedService(cfGuid: string, upsGuid: string): Observable> { + return cfEntityCatalog.userProvidedService.store.getEntityService(upsGuid, cfGuid, {}).waitForEntity$.pipe( + map(e => e.entity) + ); + } + + public createUserProvidedService( + cfGuid: string, + guid: string, + data: IUserProvidedServiceInstanceData + ): Observable { + return cfEntityCatalog.userProvidedService.api.create( + cfGuid, + guid, + data, + ).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.creating && !newV.creating), + map(([, newV]) => newV), + first(), + tap(v => { + if (!v.error) { + // Problem - Lists with multiple actions aren't updated following the creation of an entity based on secondary action + // Here the service instance list (1st action SI, 2nd action UPSI) isn't updated so manually do so + const serviceEntityConfig: EntityCatalogEntityConfig = cfEntityCatalog.serviceInstance.actions.getMultiple('', '', {}); + this.store.dispatch(new ClearPaginationOfType(serviceEntityConfig)); + } + }) + ); + } + + updateUserProvidedService( + cfGuid: string, + guid: string, + data: Partial, + ): Observable { + return cfEntityCatalog.userProvidedService.api.update(guid, cfGuid, data).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + ); + } +} 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 c15f0f84ac..cf172535cb 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 @@ -3,13 +3,16 @@ import { EffectsModule } from '@ngrx/effects'; import { CloudFoundryReducersModule } from './cloud-foundry.reducers.module'; import { AppVariablesEffect } from './effects/app-variables.effects'; +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 { PermissionEffects, PermissionsEffects } from './effects/permissions.effect'; +import { CfValidateEffects } from './effects/request.effects'; import { RouteEffect } from './effects/route.effects'; import { ServiceInstanceEffects } from './effects/service-instance.effects'; +import { UpdateAppEffects } from './effects/update-app-effects'; @NgModule({ imports: [ @@ -23,7 +26,10 @@ import { ServiceInstanceEffects } from './effects/service-instance.effects'; RouteEffect, PermissionsEffects, PermissionEffects, - ServiceInstanceEffects + ServiceInstanceEffects, + AppEffects, + UpdateAppEffects, + CfValidateEffects ]) ] }) 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 3d4fa68bd3..43a64dac5a 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 @@ -4,7 +4,7 @@ import { map } from 'rxjs/operators'; import { AppMetadataTypes } from '../../actions/app-metadata.actions'; import { AppVariables, AppVariablesUpdate } from '../../actions/app-variables.actions'; -import { UpdateExistingApplication } from '../../actions/application.actions'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; @Injectable() @@ -16,14 +16,12 @@ export class AppVariablesEffect { @Effect() apiRequestStart$ = this.actions$.pipe( ofType(AppVariables.UPDATE), - map((apiAction: AppVariablesUpdate) => { - return new UpdateExistingApplication( - apiAction.appGuid, - apiAction.cfGuid, - { ...apiAction.updatedApplication }, - null, - [AppMetadataTypes.ENV_VARS] - ); - })); + map((apiAction: AppVariablesUpdate) => cfEntityCatalog.application.actions.update( + apiAction.appGuid, + apiAction.cfGuid, + { ...apiAction.updatedApplication }, + null, + [AppMetadataTypes.ENV_VARS] + )) + ) } - diff --git a/src/frontend/packages/store/src/effects/app.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts similarity index 61% rename from src/frontend/packages/store/src/effects/app.effects.ts rename to src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts index e1f43f644b..60657b138d 100644 --- a/src/frontend/packages/store/src/effects/app.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/app.effects.ts @@ -3,19 +3,16 @@ import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { first, map } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; -import { ASSIGN_ROUTE_SUCCESS } from '../../../cloud-foundry/src/actions/application-service-routes.actions'; -import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../../cloud-foundry/src/actions/application.actions'; -import { appSummaryEntityType } from '../../../cloud-foundry/src/cf-entity-types'; +import { endpointHasMetrics } from '../../../../core/src/features/endpoints/endpoint-helpers'; +import { EndpointOnlyAppState } from '../../../../store/src/app-state'; +import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; +import { ASSIGN_ROUTE_SUCCESS } from '../../actions/application-service-routes.actions'; +import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../actions/application.actions'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { createAppInstancesMetricAction, -} from '../../../cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; -import { endpointHasMetrics } from '../../../core/src/features/endpoints/endpoint-helpers'; -import { EndpointOnlyAppState } from '../app-state'; -import { APISuccessOrFailedAction } from '../types/request.types'; +} from '../../shared/components/list/list-types/app-instance/cf-app-instances-config.service'; -// TODO: Move this file to cf package - #3769 @Injectable() export class AppEffects { @@ -27,10 +24,7 @@ export class AppEffects { @Effect({ dispatch: false }) updateSummary$ = this.actions$.pipe( ofType(ASSIGN_ROUTE_SUCCESS), map(action => { - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const actionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = actionBuilder(action.apiAction.guid, action.apiAction.endpointGuid); - this.store.dispatch(getAppSummaryAction); + cfEntityCatalog.appSummary.api.get(action.apiAction.guid, action.apiAction.endpointGuid) }), ); diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts index 955712ef86..7f86644ba1 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts @@ -1,15 +1,19 @@ +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, flatMap, mergeMap } from 'rxjs/operators'; -import { GET_CF_INFO, GetCFInfo } from '../../actions/cloud-foundry.actions'; -import { CFAppState } from '../../cf-app-state'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { environment } from '../../../../core/src/environments/environment.prod'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { NormalizedResponse } from '../../../../store/src/types/api.types'; -import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess } from '../../../../store/src/types/request.types'; -import { HttpClient } from '@angular/common/http'; +import { + StartRequestAction, + WrapperRequestActionFailed, + WrapperRequestActionSuccess, +} from '../../../../store/src/types/request.types'; +import { GET_CF_INFO, GetCFInfo } from '../../actions/cloud-foundry.actions'; +import { CFAppState } from '../../cf-app-state'; @Injectable() export class CloudFoundryEffects { @@ -29,7 +33,7 @@ export class CloudFoundryEffects { const cfInfoKey = catalogEntity.entityKey; this.store.dispatch(new StartRequestAction(action, actionType)); const requestArgs = { - headers: { 'x-cap-cnsi-list': action.cfGuid } + headers: { 'x-cap-cnsi-list': action.guid } }; const url = `/pp/${this.proxyAPIVersion}/proxy/v2/info`; return this.http @@ -40,7 +44,7 @@ export class CloudFoundryEffects { entities: { [cfInfoKey]: {} }, result: [] } as NormalizedResponse; - const id = action.cfGuid; + const id = action.guid; mappedData.entities[cfInfoKey][id] = { entity: info[id], @@ -53,7 +57,7 @@ export class CloudFoundryEffects { }), catchError(error => [ new WrapperRequestActionFailed(error.message, action, actionType, { - endpointIds: [action.cfGuid], + endpointIds: [action.guid], url: error.url || url, eventCode: error.status ? error.status + '' : '500', message: 'Cloud Foundry Info request error', 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 569136aa7b..11a4310bf8 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 @@ -6,7 +6,7 @@ import { of as observableOf } from 'rxjs'; import { catchError, filter, map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators'; import { LoggerService } from '../../../../core/src/core/logger.service'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +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 { @@ -18,10 +18,12 @@ import { import { CHECK_PROJECT_EXISTS, CheckProjectExists, + FETCH_BRANCH_FOR_PROJECT, FETCH_BRANCHES_FOR_PROJECT, FETCH_COMMIT, FETCH_COMMITS, FetchBranchesForProject, + FetchBranchForProject, FetchCommit, FetchCommits, ProjectDoesntExist, @@ -122,6 +124,38 @@ export class DeployAppEffects { ])); })); + @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, this.logger), apiAction, actionType) + ])); + })); + @Effect() fetchCommit$ = this.actions$.pipe( ofType(FETCH_COMMIT), @@ -182,7 +216,7 @@ export class DeployAppEffects { })); addCommit(entityKey: string, mappedData: NormalizedResponse, scmType: string, projectName: string, commit: GitCommit) { - const id = scmType + '-' + projectName + '-' + commit.sha; + const id = scmType + '-' + projectName + '-' + commit.sha; // FIXME: get from action, see #4245 mappedData.entities[entityKey][id] = commit; // mappedData.entities[entityKey][id] = { // entity: commit, 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 index e2bd9fc694..0864d7b8da 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts @@ -5,17 +5,17 @@ import { Store } from '@ngrx/store'; import { catchError, mergeMap } from 'rxjs/operators'; import { LoggerService } from '../../../../core/src/core/logger.service'; -import { GitSCMService, GitSCMType } from '../../../../core/src/shared/data-services/scm/scm.service'; import { NormalizedResponse } from '../../../../store/src/types/api.types'; import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess, } from '../../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../../cf-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. @@ -41,24 +41,17 @@ export class GithubEffects { entityType: gitRepoEntityType, endpointType: CF_ENDPOINT_TYPE, type: action.type, - guid: action.stProject.deploySource.project + guid: action.guid }; this.store.dispatch(new StartRequestAction(apiAction, actionType)); - const scmType = action.stProject.deploySource.scm || action.stProject.deploySource.type; - const scm = this.scmService.getSCM(scmType as GitSCMType); - return scm.getRepository(this.httpClient, action.stProject.deploySource.project).pipe( + return action.meta.scm.getRepository(this.httpClient, action.meta.projectName).pipe( mergeMap(repoDetails => { const mappedData = { entities: { cfGitRepo: {} }, result: [] } as NormalizedResponse; - const id = scmType + '-' + repoDetails.full_name; - mappedData.entities.cfGitRepo[id] = repoDetails; - // mappedData.entities.cfGitRepo[id] = { - // entity: repoDetails, - // metadata: {} - // }; - mappedData.result.push(id); + mappedData.entities.cfGitRepo[action.guid] = repoDetails; + mappedData.result.push(action.guid); return [ new WrapperRequestActionSuccess(mappedData, apiAction, actionType) ]; diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts b/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts index 0a49a853e8..8c713def7c 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts @@ -19,7 +19,7 @@ import { import { LoggerService } from '../../../../core/src/core/logger.service'; import { CONNECT_ENDPOINTS_SUCCESS, EndpointActionComplete } from '../../../../store/src/actions/endpoint.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { BaseHttpClientFetcher, flattenPagination, @@ -44,9 +44,7 @@ import { UserRelationTypes, } from '../../actions/permissions.actions'; import { CFAppState } from '../../cf-app-state'; -import { - createCfFeatureFlagFetchAction, -} from '../../shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { CFResponse } from '../types/cf-api.types'; class PermissionFlattener extends BaseHttpClientFetcher implements PaginationFlattener { @@ -213,7 +211,7 @@ export class PermissionsEffects { this.store.dispatch(new GetUserCfRelations(endpoint.guid, GET_CURRENT_USER_CF_RELATIONS)); // Dispatch feature flags fetch actions - const ffAction = createCfFeatureFlagFetchAction(endpoint.guid); + const ffAction = cfEntityCatalog.featureFlag.actions.getMultiple(endpoint.guid) requests[endpoint.guid] = [createPaginationCompleteWatcher(this.store, ffAction)]; this.store.dispatch(ffAction); diff --git a/src/frontend/packages/store/src/effects/request.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/request.effects.ts similarity index 84% rename from src/frontend/packages/store/src/effects/request.effects.ts rename to src/frontend/packages/cloud-foundry/src/store/effects/request.effects.ts index 35b5fe0175..9cd7107c35 100644 --- a/src/frontend/packages/store/src/effects/request.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/request.effects.ts @@ -3,19 +3,19 @@ import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { catchError, first, map, mergeMap, withLatestFrom } from 'rxjs/operators'; -import { CFAppState } from '../../../cloud-foundry/src/cf-app-state'; -import { validateEntityRelations } from '../../../cloud-foundry/src/entity-relations/entity-relations'; -import { LoggerService } from '../../../core/src/core/logger.service'; -import { SET_PAGE_BUSY } from '../actions/pagination.actions'; +import { LoggerService } from '../../../../core/src/core/logger.service'; +import { SET_PAGE_BUSY } from '../../../../store/src/actions/pagination.actions'; +import { rootUpdatingKey } from '../../../../store/src/reducers/api-request-reducer/types'; +import { getAPIRequestDataState } from '../../../../store/src/selectors/api.selectors'; +import { getPaginationState } from '../../../../store/src/selectors/pagination.selectors'; +import { UpdateCfAction } from '../../../../store/src/types/request.types'; import { CfValidateEntitiesComplete, CfValidateEntitiesStart, EntitiesPipelineActionTypes, -} from '../actions/request.actions'; -import { rootUpdatingKey } from '../reducers/api-request-reducer/types'; -import { getAPIRequestDataState } from '../selectors/api.selectors'; -import { getPaginationState } from '../selectors/pagination.selectors'; -import { UpdateCfAction } from '../types/request.types'; +} from '../../actions/relations-actions'; +import { CFAppState } from '../../cf-app-state'; +import { validateEntityRelations } from '../../entity-relations/entity-relations'; /** * Now purely looks after ad-hoc validation of an entity or list of entities @@ -43,8 +43,6 @@ export class CfValidateEffects { * 5) alternatively... if we've reached here for the same space but from an api request for that space.. ensure that the routes have not * been dropped because their count is over 50 */ - // TODO Move this into Cf - #3769... - // ... See `ENTITY_INFO_HANDLER` (which should also be used, in a roundabout way, in getPaginationObservables/getObservables) @Effect() validateEntities$ = this.actions$.pipe( ofType(EntitiesPipelineActionTypes.VALIDATE), mergeMap(action => { diff --git a/src/frontend/packages/store/src/effects/update-app-effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts similarity index 52% rename from src/frontend/packages/store/src/effects/update-app-effects.ts rename to src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts index a0558f9851..a29f72b026 100644 --- a/src/frontend/packages/store/src/effects/update-app-effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/update-app-effects.ts @@ -2,14 +2,10 @@ import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { mergeMap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; -import { AppMetadataTypes } from '../../../cloud-foundry/src/actions/app-metadata.actions'; -import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../../cloud-foundry/src/actions/application.actions'; -import { appEnvVarsEntityType, appStatsEntityType, appSummaryEntityType } from '../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; -import { WrapperRequestActionSuccess } from '../types/request.types'; - - +import { WrapperRequestActionSuccess } from '../../../../store/src/types/request.types'; +import { AppMetadataTypes } from '../../actions/app-metadata.actions'; +import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../actions/application.actions'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; @Injectable() export class UpdateAppEffects { @@ -29,15 +25,10 @@ export class UpdateAppEffects { switch (updateEntity) { case AppMetadataTypes.ENV_VARS: // This is done so the app metadata env vars environment_json matches that of the app - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(action.apiAction.guid, action.apiAction.endpointGuid as string); - actions.push(getAppEnvVarsAction); + actions.push(cfEntityCatalog.appEnvVar.actions.getMultiple(action.apiAction.guid, action.apiAction.endpointGuid)); break; case AppMetadataTypes.STATS: - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const appStatsActionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const statsAction = appStatsActionBuilder(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 @@ -48,13 +39,11 @@ export class UpdateAppEffects { } break; case AppMetadataTypes.SUMMARY: - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const appSummaryActionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = appSummaryActionBuilder(action.apiAction.guid, action.apiAction.endpointGuid as string); - actions.push(getAppSummaryAction); + actions.push(cfEntityCatalog.appSummary.actions.get(action.apiAction.guid, action.apiAction.endpointGuid)); break; } }); + return actions; })); } diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/app-stats-request.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/app-stats-request.reducer.ts deleted file mode 100644 index ab9cabad3d..0000000000 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/app-stats-request.reducer.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../actions/application.actions'; -import { IRequestEntityTypeState } from '../../../../store/src/app-state'; -import { RequestInfoState } from '../../../../store/src/reducers/api-request-reducer/types'; - -export function appStatsReducer(state: IRequestEntityTypeState, action) { - switch (action.type) { - case UPDATE_SUCCESS: - const updateAction: UpdateExistingApplication = action.apiAction; - return markAppStatsAsDeleted(state, updateAction); - default: - return state; - } -} - -function deleteAppStat(newState, key) { - const state = newState[key]; - if (!state) { - return; - } - newState[key] = { - ...state, - deleting: { - ...state.deleting, - deleted: true, - } - }; -} - -function markAppStatsAsDeleted(state: IRequestEntityTypeState, action: UpdateExistingApplication) { - // Only interest if we have the old and new app and either the app has been stopped or now contains zero instances - if (!action.newApplication || !action.existingApplication) { - return state; - } - if (action.newApplication.state !== 'STOPPED' && action.newApplication.instances !== 0) { - return state; - } - const newState = { ...state }; - // Delete root stat - deleteAppStat(newState, action.guid); - // Delete each instance stat - const instances = action.existingApplication.instances || 0; - for (let i = 0; i < instances; i++) { - deleteAppStat(newState, action.guid + '-' + i); - } - return newState; -} diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/application-route.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/application-route.reducer.ts index 1695edbbb8..f5138fe60f 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/application-route.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/application-route.reducer.ts @@ -1,9 +1,9 @@ -import { ASSIGN_ROUTE_SUCCESS, AssignRouteToApplication } from '../../actions/application-service-routes.actions'; -import { BaseRouteAction, RouteEvents } from '../../actions/route.actions'; +import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { APIResource } from '../../../../store/src/types/api.types'; import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; -import { IApp } from '../../../../core/src/core/cf-api.types'; -import { IRequestEntityTypeState } from '../../../../store/src/app-state'; +import { ASSIGN_ROUTE_SUCCESS, AssignRouteToApplication } from '../../actions/application-service-routes.actions'; +import { BaseRouteAction, RouteEvents } from '../../actions/route.actions'; +import { IApp } from '../../cf-api.types'; export function updateApplicationRoutesReducer() { return ( diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-cf-roles.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-cf-roles.reducer.ts index 095a5bb40c..3cb9fbf328 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-cf-roles.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-cf-roles.reducer.ts @@ -1,7 +1,7 @@ -import { ISpace } from '../../../../../core/src/core/cf-api.types'; import { APIResource } from '../../../../../store/src/types/api.types'; import { getDefaultEndpointRoles } from '../../../../../store/src/types/current-user-roles.types'; import { GetCurrentUserRelationsComplete, UserRelationTypes } from '../../../actions/permissions.actions'; +import { ISpace } from '../../../cf-api.types'; import { ICfRolesState, IOrgsRoleState } from '../../types/cf-current-user-roles.types'; import { createOrgRoleStateState } from './current-user-roles-org.reducer'; import { currentUserOrgRolesReducer } from './current-user-roles-orgs.reducer'; diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-roles-space.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-roles-space.reducer.ts index bf04b91a40..fda7c35762 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-roles-space.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/current-user-roles-reducer/current-user-roles-space.reducer.ts @@ -1,6 +1,6 @@ -import { ISpace } from '../../../../../core/src/core/cf-api.types'; import { APIResource } from '../../../../../store/src/types/api.types'; import { UserRelationTypes } from '../../../actions/permissions.actions'; +import { ISpace } from '../../../cf-api.types'; import { ISpaceRoleState } from '../../types/cf-current-user-roles.types'; export const defaultUserSpaceRoleState: ISpaceRoleState = { diff --git a/src/frontend/packages/store/src/reducers/endpoint-disconnect-application.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/endpoint-disconnect-application.reducer.ts similarity index 74% rename from src/frontend/packages/store/src/reducers/endpoint-disconnect-application.reducer.ts rename to src/frontend/packages/cloud-foundry/src/store/reducers/endpoint-disconnect-application.reducer.ts index 8074954644..7e6d015061 100644 --- a/src/frontend/packages/store/src/reducers/endpoint-disconnect-application.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/endpoint-disconnect-application.reducer.ts @@ -1,7 +1,11 @@ -import { IApp, StratosCFEntity } from '../../../core/src/core/cf-api.types'; -import { DISCONNECT_ENDPOINTS_SUCCESS, DisconnectEndpoint, UNREGISTER_ENDPOINTS_SUCCESS } from '../actions/endpoint.actions'; -import { IRequestEntityTypeState } from '../app-state'; -import { APIResource } from '../types/api.types'; +import { + DISCONNECT_ENDPOINTS_SUCCESS, + DisconnectEndpoint, + UNREGISTER_ENDPOINTS_SUCCESS, +} from '../../../../store/src/actions/endpoint.actions'; +import { IRequestEntityTypeState } from '../../../../store/src/app-state'; +import { APIResource } from '../../../../store/src/types/api.types'; +import { StratosCFEntity } from '../../cf-api.types'; // #3704 - These can be removed after this ticket is completed export function endpointDisconnectRemoveEntitiesReducer() { diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/organization-quota.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/organization-quota.reducer.ts index 4923fd1376..314a6288b5 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/organization-quota.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/organization-quota.reducer.ts @@ -1,7 +1,7 @@ -import { IOrganization } from '../../../../core/src/core/cf-api.types'; import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { APIResource, NormalizedResponse } from '../../../../store/src/types/api.types'; import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; +import { IOrganization } from '../../cf-api.types'; import { getCFEntityKey } from '../../cf-entity-helpers'; type entityOrgType = APIResource>; diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/organization-space.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/organization-space.reducer.ts index 482104d0c0..8853e0eb5d 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/organization-space.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/organization-space.reducer.ts @@ -1,15 +1,10 @@ -import { - CREATE_SPACE_SUCCESS, - CreateSpace, - DELETE_SPACE_SUCCESS, - DeleteSpace, -} from '../../actions/space.actions'; -import { spaceEntityType } from '../../cf-entity-types'; -import { getCFEntityKey } from '../../cf-entity-helpers'; -import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { APIResource, NormalizedResponse } from '../../../../store/src/types/api.types'; import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; +import { CREATE_SPACE_SUCCESS, CreateSpace, DELETE_SPACE_SUCCESS, DeleteSpace } from '../../actions/space.actions'; +import { IOrganization, ISpace } from '../../cf-api.types'; +import { getCFEntityKey } from '../../cf-entity-helpers'; +import { spaceEntityType } from '../../cf-entity-types'; type entityOrgType = APIResource>; // Note - This reducer will be updated when we address general deletion of entities within inline lists (not paginated lists) diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/routes.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/routes.reducer.ts index c976b9276e..67746f0033 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/routes.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/routes.reducer.ts @@ -1,9 +1,9 @@ -import { IAppSummary, IRoute } from '../../../../core/src/core/cf-api.types'; import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { APIResource } from '../../../../store/src/types/api.types'; import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; import { ASSIGN_ROUTE_SUCCESS, AssignRouteToApplication } from '../../actions/application-service-routes.actions'; import { DeleteRoute, RouteEvents, UnmapRoute } from '../../actions/route.actions'; +import { IAppSummary, IRoute } from '../../cf-api.types'; export function routeReducer(state: IRequestEntityTypeState>, action: APISuccessOrFailedAction) { switch (action.type) { diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/service-instance.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/service-instance.reducer.ts index 8e9d775159..c97537a6a1 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/service-instance.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/service-instance.reducer.ts @@ -1,4 +1,3 @@ -import { IServiceBinding, IServiceInstance, IUserProvidedServiceInstance } from '../../../../core/src/core/cf-api-svc.types'; import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { APIResource } from '../../../../store/src/types/api.types'; import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; @@ -8,6 +7,7 @@ import { DELETE_SERVICE_BINDING_ACTION_SUCCESS, DeleteServiceBinding, } from '../../actions/service-bindings.actions'; +import { IServiceBinding, IServiceInstance, IUserProvidedServiceInstance } from '../../cf-api-svc.types'; import { getCFEntityKey } from '../../cf-entity-helpers'; import { serviceBindingEntityType } from '../../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/space-quota.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/space-quota.reducer.ts index ebe034d55e..299c2e2393 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/space-quota.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/space-quota.reducer.ts @@ -1,14 +1,14 @@ -import { getCFEntityKey } from '../../cf-entity-helpers'; -import { ISpace, ISpaceQuotaDefinition } from '../../../../core/src/core/cf-api.types'; +import { IRequestEntityTypeState } from '../../../../store/src/app-state'; +import { APIResource, NormalizedResponse } from '../../../../store/src/types/api.types'; +import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; import { ASSOCIATE_SPACE_QUOTA_DEFINITION_SUCCESS, AssociateSpaceQuota, DISASSOCIATE_SPACE_QUOTA_DEFINITION_SUCCESS, DisassociateSpaceQuota, } from '../../actions/quota-definitions.actions'; -import { IRequestEntityTypeState } from '../../../../store/src/app-state'; -import { APIResource, NormalizedResponse } from '../../../../store/src/types/api.types'; -import { APISuccessOrFailedAction } from '../../../../store/src/types/request.types'; +import { ISpace, ISpaceQuotaDefinition } from '../../cf-api.types'; +import { getCFEntityKey } from '../../cf-entity-helpers'; type entityOrgType = APIResource; export function updateSpaceQuotaReducer( diff --git a/src/frontend/packages/cloud-foundry/src/store/reducers/users.reducer.ts b/src/frontend/packages/cloud-foundry/src/store/reducers/users.reducer.ts index d49783980a..42376488c6 100644 --- a/src/frontend/packages/cloud-foundry/src/store/reducers/users.reducer.ts +++ b/src/frontend/packages/cloud-foundry/src/store/reducers/users.reducer.ts @@ -1,4 +1,3 @@ -import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { DISCONNECT_ENDPOINTS_SUCCESS, DisconnectEndpoint } from '../../../../store/src/actions/endpoint.actions'; import { IRequestEntityTypeState } from '../../../../store/src/app-state'; import { deepMergeState } from '../../../../store/src/helpers/reducer.helper'; @@ -11,6 +10,7 @@ import { createDefaultUserRelations, REMOVE_ROLE_SUCCESS, } from '../../actions/users.actions'; +import { IOrganization, ISpace } from '../../cf-api.types'; import { cfUserEntityType } from '../../cf-entity-types'; import { CfUser, 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 index 9d61db0197..73f6b888ad 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts @@ -1,5 +1,3 @@ -import { schema } from 'normalizr'; - export interface GithubRepo { pushed_at: string; created_at: string; @@ -18,7 +16,7 @@ export interface GithubUser { type: string; } -export interface GitBranch { +export interface GitHubBranch { name: string; commit?: GithubCommit; } diff --git a/src/frontend/packages/cloud-foundry/src/store/types/route.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/route.types.ts index fbdb5ae53a..2c1e36676e 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/route.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/route.types.ts @@ -1,5 +1,5 @@ -import { IApp } from '../../../../core/src/core/cf-api.types'; import { APIResource } from '../../../../store/src/types/api.types'; +import { IApp } from '../../cf-api.types'; export class Route { diff --git a/src/frontend/packages/cloud-foundry/src/store/types/user.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/user.types.ts index 98921949ea..7995365bab 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/user.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/user.types.ts @@ -1,5 +1,5 @@ -import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { APIResource } from '../../../../store/src/types/api.types'; +import { IOrganization, ISpace } from '../../cf-api.types'; export function getDefaultCfUserMissingRoles(): CfUserMissingRoles { return { diff --git a/src/frontend/packages/core/test-framework/application-service-helper.ts b/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts similarity index 60% rename from src/frontend/packages/core/test-framework/application-service-helper.ts rename to src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts index e4fcb83dab..6c07e9ba8f 100644 --- a/src/frontend/packages/core/test-framework/application-service-helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/application-service-helper.ts @@ -1,28 +1,24 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf } from 'rxjs'; +import { map } from 'rxjs/internal/operators/map'; -import { CFAppState } from '../../cloud-foundry/src/cf-app-state'; -import { ApplicationData, ApplicationService } from '../../cloud-foundry/src/features/applications/application.service'; -import { - ApplicationEnvVarsHelper, - EnvVarStratosProject, -} from '../../cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; -import { AppStat } from '../../cloud-foundry/src/store/types/app-metadata.types'; import { RequestInfoState } from '../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../store/src/types/api.types'; -import { IApp, IAppSummary, IDomain, ISpace } from '../src/core/cf-api.types'; -import { EntityServiceFactory } from '../../store/src/entity-service-factory.service'; +import { IApp, IAppSummary, IDomain, ISpace } from '../src/cf-api.types'; +import { CFAppState } from '../src/cf-app-state'; +import { ApplicationData, ApplicationService } from '../src/features/applications/application.service'; import { - ApplicationStateData, - ApplicationStateService, -} from '../src/shared/components/application-state/application-state.service'; -import { PaginationMonitorFactory } from '../../store/src/monitors/pagination-monitor.factory'; + ApplicationEnvVarsHelper, + EnvVarStratosProject, +} from '../src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; +import { ApplicationStateData, ApplicationStateService } from '../src/shared/services/application-state.service'; +import { AppStat } from '../src/store/types/app-metadata.types'; function createEntity(entity: T): APIResource { return { metadata: { created_at: '', - guid: '', + guid: 'mockEntityGuid', updated_at: '', url: '' }, @@ -37,42 +33,43 @@ export class ApplicationServiceMock { appGuid = ApplicationServiceMock.appGuid; application$: Observable = observableOf(({ cf: { - guid: 'mockCfGuid' + guid: this.cfGuid }, app: { - metadata: {}, - entity: { + metadata: { + guid: this.appGuid }, - entityRequestInfo: {} as RequestInfoState - } as EntityInfo, + entity: { + space_guid: 'mockSpaceGuid', + cfGuid: this.cfGuid + } as IApp, + } as APIResource, stack: { entity: { }, }, fetching: false } as ApplicationData)); - app$: Observable>> = observableOf({ - entity: { entity: {} } - } as EntityInfo>); - appSummary$: Observable> = observableOf({ + app$: Observable>> = this.application$.pipe( + map(appData => { + return { + entity: appData.app, + entityRequestInfo: { + + } as RequestInfoState + } + }) + ); + appSummary$: Observable>> = observableOf({ entityRequestInfo: { fetching: false } - } as EntityInfo); + } as EntityInfo>); appStats$: Observable = observableOf(new Array()); applicationStratProject$: Observable = observableOf({ deploySource: { type: 'github', timestamp: 0, commit: '' }, deployOverrides: null }); isFetchingApp$: Observable = observableOf(false); isFetchingEnvVars$: Observable = observableOf(false); isUpdatingEnvVars$: Observable = observableOf(false); - waitForAppEntity$: Observable = observableOf({ - entity: createEntity({ - space: { - metadata: {}, - entity: { - domains: [] - } - } - }) - } as EntityInfo); + waitForAppEntity$: Observable>> = this.app$; appEnvVars = { entities$: observableOf(new Array>()) }; @@ -91,28 +88,22 @@ export function generateTestApplicationServiceProvider(appGuid: string, cfGuid: provide: ApplicationService, useFactory: ( store: Store, - entityServiceFactory: EntityServiceFactory, applicationStateService: ApplicationStateService, applicationEnvVarsService: ApplicationEnvVarsHelper, - paginationMonitorFactory: PaginationMonitorFactory, ) => { const appService = new ApplicationService( cfGuid, appGuid, store, - entityServiceFactory, applicationStateService, applicationEnvVarsService, - paginationMonitorFactory ); return appService; }, deps: [ Store, - EntityServiceFactory, ApplicationStateService, ApplicationEnvVarsHelper, - PaginationMonitorFactory ] }; } diff --git a/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts index 7a72e4072a..dfb1e5297e 100644 --- a/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts @@ -7,7 +7,7 @@ import { testSCFEndpointGuid } from '@stratos/store/testing'; import { CoreModule } from '../../core/src/core/core.module'; import { SharedModule } from '../../core/src/shared/shared.module'; -import { CfUserServiceTestProvider } from '../../core/test-framework/user-service-helper'; +import { AppTestModule } from '../../core/test-framework/core-test.helper'; import { EntityServiceFactory } from '../../store/src/entity-service-factory.service'; import { EntityMonitorFactory } from '../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitorFactory } from '../../store/src/monitors/pagination-monitor.factory'; @@ -16,11 +16,15 @@ import { CFAppState } from '../src/cf-app-state'; import { CloudFoundryTestingModule } from '../src/cloud-foundry-test.module'; import { ActiveRouteCfOrgSpace } from '../src/features/cloud-foundry/cf-page.types'; import { CloudFoundryEndpointService } from '../src/features/cloud-foundry/services/cloud-foundry-endpoint.service'; -import { UserInviteService } from '../src/features/cloud-foundry/user-invites/user-invite.service'; +import { + UserInviteConfigureService, + UserInviteService, +} from '../src/features/cloud-foundry/user-invites/user-invite.service'; import { CfOrgSpaceDataService } from '../src/shared/data-services/cf-org-space-service.service'; import { CfUserService } from '../src/shared/data-services/cf-user.service'; import { CloudFoundryService } from '../src/shared/data-services/cloud-foundry.service'; import { createUserRoleInOrg } from '../src/store/types/user.types'; +import { CfUserServiceTestProvider } from './user-service-helper'; export const cfEndpointServiceProviderDeps = [ EntityServiceFactory, @@ -74,6 +78,7 @@ export function generateTestCfEndpointServiceProvider(guid = testSCFEndpointGuid CfUserServiceTestProvider, CloudFoundryEndpointService, UserInviteService, + UserInviteConfigureService, HttpClient, HttpHandler ]; @@ -92,16 +97,14 @@ export function generateTestCfUserServiceProvider(guid = testSCFEndpointGuid) { useFactory: ( store: Store, paginationMonitorFactory: PaginationMonitorFactory, - entityServiceFactory: EntityServiceFactory ) => { return new CfUserService( store, paginationMonitorFactory, { cfGuid: guid, orgGuid: guid, spaceGuid: guid }, - entityServiceFactory, ); }, - deps: [Store, PaginationMonitorFactory, EntityServiceFactory, HttpClient] + deps: [Store, PaginationMonitorFactory, HttpClient] }; } @@ -176,7 +179,8 @@ export function generateCfStoreModules() { StoreModule.forRoot( appReducers, { runtimeChecks: { strictStateImmutability: false, strictActionImmutability: false } }, // Do not include initial store here, it's properties will be ignored as they won't have corresponding reducers in appReducers - ) + ), + AppTestModule ]; } @@ -193,6 +197,6 @@ export function generateCfBaseTestModulesNoShared() { export function generateCfBaseTestModules() { return [ ...generateCfBaseTestModulesNoShared(), - SharedModule + SharedModule, ]; } diff --git a/src/frontend/packages/core/test-framework/cloud-foundry-organization.service.mock.ts b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-organization.service.mock.ts similarity index 93% rename from src/frontend/packages/core/test-framework/cloud-foundry-organization.service.mock.ts rename to src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-organization.service.mock.ts index effdd309a0..5d765b0e0a 100644 --- a/src/frontend/packages/core/test-framework/cloud-foundry-organization.service.mock.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-organization.service.mock.ts @@ -3,8 +3,6 @@ import { Observable, of as observableOf } from 'rxjs'; import { getDefaultRequestState } from '../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../store/src/types/api.types'; -// TODO: Move this file to cf package - #3769 - export class CloudFoundryOrganizationServiceMock { org$: Observable>> = observableOf( { diff --git a/src/frontend/packages/core/test-framework/cloud-foundry-space.service.mock.ts b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-space.service.mock.ts similarity index 87% rename from src/frontend/packages/core/test-framework/cloud-foundry-space.service.mock.ts rename to src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-space.service.mock.ts index 18d32543f4..385bf3b793 100644 --- a/src/frontend/packages/core/test-framework/cloud-foundry-space.service.mock.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-space.service.mock.ts @@ -1,10 +1,6 @@ import { Observable, of as observableOf } from 'rxjs'; -import { - CloudFoundrySpaceService, -} from '../../cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service'; - -// TODO: Move this file to cf package - #3769 +import { CloudFoundrySpaceService } from '../src/features/cloud-foundry/services/cloud-foundry-space.service'; export class CloudFoundrySpaceServiceMock { diff --git a/src/frontend/packages/store/src/helpers/entity-relations/entity-relations-spec-helper.ts b/src/frontend/packages/cloud-foundry/test-framework/entity-relations-spec-helper.ts similarity index 92% rename from src/frontend/packages/store/src/helpers/entity-relations/entity-relations-spec-helper.ts rename to src/frontend/packages/cloud-foundry/test-framework/entity-relations-spec-helper.ts index afc78335b1..d5e563a756 100644 --- a/src/frontend/packages/store/src/helpers/entity-relations/entity-relations-spec-helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/entity-relations-spec-helper.ts @@ -1,5 +1,5 @@ -import { IOrganization, IOrgQuotaDefinition, ISpace } from '../../../../core/src/core/cf-api.types'; -import { APIResource } from '../../types/api.types'; +import { APIResource } from '../../store/src/types/api.types'; +import { IOrganization, IOrgQuotaDefinition, ISpace } from '../src/cf-api.types'; export const entityRelationMissingSpacesUrl = 'spaces_url'; export const entityRelationMissingQuotaGuid = 'quota_guid'; diff --git a/src/frontend/packages/core/test-framework/user-service-helper.ts b/src/frontend/packages/cloud-foundry/test-framework/user-service-helper.ts similarity index 75% rename from src/frontend/packages/core/test-framework/user-service-helper.ts rename to src/frontend/packages/cloud-foundry/test-framework/user-service-helper.ts index 824f8e9211..74970be342 100644 --- a/src/frontend/packages/core/test-framework/user-service-helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/user-service-helper.ts @@ -1,7 +1,7 @@ import { HttpBackend, HttpClient } from '@angular/common/http'; import { HttpTestingController } from '@angular/common/http/testing'; -import { CfUserService } from '../../cloud-foundry/src/shared/data-services/cf-user.service'; +import { CfUserService } from '../src/shared/data-services/cf-user.service'; export const CfUserServiceTestProvider = [ diff --git a/src/frontend/packages/cloud-foundry/tsconfig.lib.prod.json b/src/frontend/packages/cloud-foundry/tsconfig.lib.prod.json new file mode 100644 index 0000000000..b1d501abbc --- /dev/null +++ b/src/frontend/packages/cloud-foundry/tsconfig.lib.prod.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.lib.json", + "angularCompilerOptions": { + "enableIvy": false + } +} \ No newline at end of file diff --git a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.eot b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.eot index 7d8b8a1547..8082a90cb7 100644 Binary files a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.eot and b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.eot differ diff --git a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.svg b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.svg index 6e4b814e31..0cc8ced7f6 100644 --- a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.svg +++ b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.svg @@ -2,7 +2,7 @@ -Created by FontForge 20180321 at Fri Jan 31 19:10:36 2020 +Created by FontForge 20180321 at Fri May 15 14:10:56 2020 By Neil MacDougall @@ -18,10 +18,18 @@ Created by FontForge 20180321 at Fri Jan 31 19:10:36 2020 bbox="-0.595506 -64.5 512 448" underline-thickness="25" underline-position="-76" - unicode-range="U+005F-F141" + unicode-range="U+005F-F187" /> + + + @@ -30,14 +38,23 @@ d="M43 277v43h341v-43h-341zM85 363v42h256v-42h-256zM384 235q18 0 30.5 -12.5t12.5 + + + @@ -48,6 +65,9 @@ v-43h256z" /> d="M426 339q12 -7 20 -21t8 -27v-198q0 -13 -8 -27t-20 -20l-172 -100q-11 -7 -27 -7t-27 7l-173 100q-11 6 -19 20t-8 27v199q0 13 8 26.5t19 20.5l173 99q11 7 27 7q15 0 27 -7z" /> + + + + - +d="M139 146q12 0 20.5 -8.5t8.5 -20t-8.5 -20t-20.5 -8.5t-20.5 8.5t-8.5 20t8.5 20t20.5 8.5zM213 405l128 -128v-256q0 -17 -12.5 -29.5t-29.5 -13.5h-257q-17 1 -29.5 13t-12.5 30v341v1q0 17 12.5 29.5t30.5 12.5h170zM232 86v2q0 3 -1 4l-21 16q1 5 1 10t-1 9l20 16 +q2 1 2 4v2l-20 33q-1 3 -4 3q-1 0 -2 -1l-23 -9q-8 6 -17 9l-3 25q-1 5 -5 5h-38q-4 -1 -5 -5l-4 -25q-9 -4 -16 -9l-24 9q-1 1 -2 1q-2 0 -4 -3l-19 -33q-1 -1 -1 -2q0 -3 2 -4l20 -16v-9.5v-9.5l-20 -16q-2 -1 -2 -4q0 -1 1 -2l19 -33q2 -3 4 -3q1 0 2 1l24 9q7 -6 16 -9 +l4 -25q0 -4 5 -4h38q4 0 5 4l3 25q9 4 17 9l24 -9q0 -1 1 -1q3 0 5 3zM192 256h117l-117 117v-117z" /> + + + + + + + + + @@ -102,9 +167,11 @@ d="M384 170h-256v-106h21v-85h-85v85h21v106h-85v43h256v107h-21v85h85v-85h-21v-107 d="M0 343l27 27l357 -357l-27 -27l-185 184h-31v-106h21v-85h-85v85h21v106h-85v43h117zM312 213h85v-43h-116l-42 43h30v107h-21v85h85v-85h-21v-107z" /> + +d="M235 171q-9 0 -15.5 6t-6.5 15v21h-106v-149h106v21q0 9 6.5 15.5t15.5 6.5h42l22 -22h64q8 0 14.5 -6t6.5 -15v-64q0 -9 -6.5 -15t-14.5 -6h-128q-6 0 -11 2.5t-8 7.5t-3 11v21h-149v278h-43q-8 0 -14.5 6t-6.5 15v85q0 9 6.5 15.5t14.5 6.5h43l21 -22h64q4 0 7 -1t6 -3 +t5 -4.5t3 -6t1 -6.5v-64q0 -9 -6.5 -15t-15.5 -6h-42v-43h106v21q0 9 6.5 15.5t15.5 6.5h42l22 -22h64q8 0 14.5 -6t6.5 -15v-64q0 -9 -6.5 -15t-14.5 -6h-128z" /> + + + + + + +d="M320 171l21 -168v-3q0 -9 -6 -15t-15 -6h-256q-9 0 -15 6t-6 15v3l21 168h256zM384 235v-43h-384v43h384zM250 324q16 -10 30 -30t19 -38h-43q0 9 -6.5 15t-15 6t-15 -6t-6.5 -15h-42q0 9 -6.5 15t-15 6t-15 -6t-6.5 -15h-43q5 18 19 38t30 30q-6 20 -6 40v2q0 25 6 43 +t15 18t15.5 -18t6.5 -43q0 -14 -3 -28q12 3 24 3t24 -3q-3 14 -3 28v0q0 25 6.5 43t15.5 18t15 -18t6 -43v-2q0 -20 -6 -40z" /> + + + + + + + + + + + + + + + + + - +d="M166 192q0 19 13.5 33t33 14t33 -14t13.5 -33t-13.5 -33t-33 -14t-33 14t-13.5 33zM418 311q26 -46 -37 -119q63 -73 37 -119q-19 -32 -75 -32q-13 0 -27 2q-9 1 -20 3q-15 -41 -36.5 -65t-47 -24t-47 24t-36.5 66q-23 -5 -47 -6q-57 0 -75 32q-26 46 37 119 +q-63 73 -37 118.5t122 26.5q10 28 22.5 48t28.5 31t33 11q25 0 46.5 -24t36.5 -65q11 2 20 3q79 10 102 -30zM319 317q-3 0 -9 -1.5t-7 -1.5q8 -31 12 -63q26 -19 49 -41q51 58 33 89q-12 20 -53 20q-13 0 -25 -2zM253.5 121.5q20.5 11.5 38.5 24.5q2 23 2 46t-2 46 +q-18 13 -39 25q-18 11 -41 21q-21 -10 -40 -21q-20 -12 -39 -25q-2 -23 -2 -46t2 -46q19 -13 39 -25q19 -11 41 -21q20 10 40.5 21.5zM288 114q-12 -7 -22.5 -13.5t-23.5 -12.5q19 -7 38 -13q5 19 8 39zM183 88q-13 6 -23 12q-11 7 -23 14q3 -20 8 -39q19 5 38 13zM107 165 +v27v27q-15 -13 -29 -27q14 -14 29 -27zM137 270q12 7 23 14q10 6 23 12q-18 8 -38 13q-5 -20 -8 -39zM242 296q13 -6 23.5 -12.5t22.5 -13.5q-3 20 -8 39q-19 -6 -38 -13zM318 219v-27v-27q15 13 29 27q-14 14 -29 27zM213 403q-16 0 -32 -19t-28 -52q30 -9 59 -22 +q30 13 60 22q-12 33 -27.5 52t-31.5 19zM28 299q-17 -31 33 -89q23 22 49 41q4 32 12 63q-20 4 -40 4q-43 0 -54 -19zM28 85.5q17 -30.5 94 -15.5q-8 31 -12 63q-26 19 -49 41q-50 -58 -33 -88.5zM213 -19q16 0 31.5 19t27.5 52q-30 9 -59 22q-30 -13 -60 -22q12 -33 28 -52 +t32 -19zM397 85q18 31 -33 89q-23 -22 -49 -41q-4 -32 -12 -63q1 0 7 -1.5t9 -1.5q63 -8 78 18z" /> + + - - + + + + + + + +d="M64 352q26 0 44.5 -18.5t18.5 -45.5q0 -21 -16 -50.5t-32 -48.5l-15 -19q-8 8 -18.5 21t-28 44.5t-17.5 52.5q0 27 18.5 45.5t44.5 18.5h1zM63.5 266q9.5 0 16 6.5t6.5 15.5q0 5 -1.5 9t-4.5 7.5t-7.5 5t-8.5 1.5q-10 0 -16.5 -6.5t-6.5 -16t6.5 -16t16 -6.5zM384 207 +q8 -5 14.5 -16t6.5 -21q0 -17 -12.5 -29.5t-30.5 -12.5t-30.5 12.5t-12.5 29.5q0 5 2 10.5t5 10.5t7 9.5t8 6.5v92q0 26 -18.5 45t-45.5 19q-25 0 -44 -18t-20 -44v-5v-40v-171v-21q0 -35 -25 -60t-60.5 -25t-60.5 25t-25 60v42h43v-41v0v-1q0 -17 12.5 -29.5t30 -12.5 +t30 12.5t12.5 29.5v1v20v192v19v5q2 43 33 73t74 30q33 0 63 -22.5t39 -54.5q4 -14 5 -28v-92z" /> + - + + @@ -224,6 +408,9 @@ t26 7l27 -46q-19 -11 -24.5 -32t5.5 -40zM352 238q23 0 39.5 16.5t16.5 39.5q0 15 -7 + @@ -232,16 +419,75 @@ d="M240 431q99 0 169.5 -70t70.5 -169.5t-70.5 -170t-169.5 -70.5t-169.5 70.5t-70.5 q-16 28 -36 42q-11 8 -22 11v-94zM166 344q-12 -18 -20 -41h78v94q-11 -3 -22 -11q-20 -14 -36 -42zM224 271h-87q-7 -31 -9 -64h96v64zM48 111h56q-6 31 -8 64h-63q2 -33 15 -64zM128 175q2 -33 9 -64h87v64h-96zM224 79h-78q8 -22 20 -41q16 -27 36 -42q11 -7 22 -10v93z M314 38q12 19 20 41h-78v-93q11 3 22 10q20 15 36 42zM256 111h87q7 31 9 64h-96v-64zM384 207h63q-2 33 -15 64h-56q6 -31 8 -64zM415 303q-12 19 -28 35q-25 26 -57 41q23 -31 37 -76h48zM93 338q-16 -16 -28 -35h48q14 45 37 76q-32 -15 -57 -41zM65 79q12 -19 28 -35 q25 -25 57 -41q-23 32 -37 76h-48zM387 44q16 16 28 35h-48q-14 -44 -37 -76q32 16 57 41z" /> - - + + + + + + + + + + + + + + +d="M491 213h21v-42h-44q-7 -72 -63 -128t-128 -63v-44h-42v44q-47 5 -89.5 32t-69.5 69.5t-32 89.5h-44v42h44q7 72 63 128t128 63v44h42v-44q36 -3 69.5 -20t59 -42.5t42.5 -59t20 -69.5h23zM293 213h51q-6 22 -25.5 41.5t-41.5 25.5v-51q10 -6 16 -16zM344 171h-51 +q-6 -10 -16 -16v-51q22 6 41.5 25.5t25.5 41.5zM235 361q-55 -7 -98 -50t-50 -98h48q7 35 36 64t64 36v48zM219 213q6 10 16 16v51q-22 -6 -41.5 -25.5t-25.5 -41.5h51zM235 155q-10 6 -16 16h-51q6 -22 25.5 -41.5t41.5 -25.5v51zM87 171q7 -55 50 -98t98 -50v48 +q-35 7 -64 36t-36 64h-48zM277 23q55 7 98 50t50 98h-48q-7 -35 -36 -64t-64 -36v-48zM377 213h48q-7 55 -50 98t-98 50v-48q35 -7 64 -36t36 -64z" /> + + + + + + + @@ -272,6 +518,8 @@ d="M0 0z" /> + diff --git a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.ttf b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.ttf index cfaa5d4555..03e81ae367 100644 Binary files a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.ttf and b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.ttf differ diff --git a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff index 6b34667c0a..15cb19f795 100644 Binary files a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff and b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff differ diff --git a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff2 b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff2 index 1c425babdd..739e8a3ae2 100644 Binary files a/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff2 and b/src/frontend/packages/core/assets/fonts/stratos/stratos-icons.woff2 differ diff --git a/src/frontend/packages/core/endpoints-health-checks.ts b/src/frontend/packages/core/endpoints-health-checks.ts index 1351edc0b0..2c7624fd76 100644 --- a/src/frontend/packages/core/endpoints-health-checks.ts +++ b/src/frontend/packages/core/endpoints-health-checks.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; +import { entityCatalog } from '../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../store/src/types/endpoint.types'; -import { entityCatalog } from '../store/src/entity-catalog/entity-catalog.service'; export class EndpointHealthCheck { diff --git a/src/frontend/packages/core/sass/components/mat-table.scss b/src/frontend/packages/core/sass/components/mat-table.scss index 085ab2d61f..6eef03a63d 100644 --- a/src/frontend/packages/core/sass/components/mat-table.scss +++ b/src/frontend/packages/core/sass/components/mat-table.scss @@ -6,3 +6,26 @@ $mat-table-header-paginator-font-size: 13px; .mat-paginator { font-size: $mat-table-header-paginator-font-size; } + +// Fix right-hand margin on tables (monitor icon appears too close to edge) +// https://github.com/cloudfoundry/stratos/issues/4234 +.stratos { + + // Only put right padding between cells + .mat-cell, .mat-header-cell { + padding: 10px 10px 10px 0; + } + + // Use margin, not padding for the left side of the first cell in the row/header/footer + .mat-cell:first-of-type, mat-footer-cell:first-of-type, mat-header-cell:first-of-type { + margin-left: 20px; + padding-left: 0; + } + + // Use margin, not padding for the right side of the first cell in the row/header/footer + .mat-cell:last-of-type, mat-footer-cell:last-of-type, mat-header-cell:last-of-type { + margin-right: 20px; + padding-right: 0; + } + +} diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-select-page/api-endpoint-select-page.component.spec.ts b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-select-page/api-endpoint-select-page.component.spec.ts index a7ea2d0df6..e8e2769c61 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-select-page/api-endpoint-select-page.component.spec.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-select-page/api-endpoint-select-page.component.spec.ts @@ -21,7 +21,9 @@ describe('ApiEndpointSelectPageComponent', () => { SharedModule, ApiDrivenViewsModule, ], - providers: [TabNavService] + providers: [ + TabNavService, + ] }) .compileComponents(); })); diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts index 62571bf9a2..c897ea9c69 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts @@ -6,7 +6,7 @@ import { map } from 'rxjs/operators'; import { GeneralAppState } from '../../../../../store/src/app-state'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { ApiEntityType } from '../../api-drive-views.types'; @Component({ diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts index 70c9cba22e..eff169381f 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts @@ -1,7 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { StratosBaseCatalogEntity } from '../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; + +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, +} from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; @Component({ selector: 'app-api-entity-list-page', diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts index f99ceb1cc7..69ce1bc3f9 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts @@ -1,14 +1,13 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { ApiEntityType } from '../../api-drive-views.types'; -import { TabNavService } from '../../../../tab-nav.service'; import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { GeneralAppState } from '../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { connectedEndpointsOfTypesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; -import { map } from 'rxjs/operators'; -import { Observable } from 'rxjs'; -import { TabNavItem } from '../../../../tab-nav.types'; +import { TabNavService } from '../../../../tab-nav.service'; import { IPageSideNavTab } from '../../../features/dashboard/page-side-nav/page-side-nav.component'; @Component({ diff --git a/src/frontend/packages/core/src/app.module.ts b/src/frontend/packages/core/src/app.module.ts index bfeef7669a..1cb71ceaa0 100644 --- a/src/frontend/packages/core/src/app.module.ts +++ b/src/frontend/packages/core/src/app.module.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; +import { NgModule, Injectable } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { Params, RouteReuseStrategy, RouterStateSnapshot } from '@angular/router'; -import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store'; +import { RouterStateSerializer, StoreRouterConnectingModule, DefaultRouterStateSerializer } from '@ngrx/router-store'; import { Store } from '@ngrx/store'; import { debounceTime, filter, withLatestFrom } from 'rxjs/operators'; @@ -14,8 +14,9 @@ import { } from '../../store/src/actions/user-favourites-actions/update-user-favorite-metadata-action'; import { GeneralEntityAppState, GeneralRequestDataState } from '../../store/src/app-state'; import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; -import { EntityActionDispatcher } from '../../store/src/entity-catalog/action-dispatcher/action-dispatcher'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +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 { endpointSchemaKey } from '../../store/src/helpers/entity-factory'; import { getAPIRequestDataState, selectEntity } from '../../store/src/selectors/api.selectors'; import { internalEventStateSelector } from '../../store/src/selectors/internal-events.selectors'; @@ -59,6 +60,7 @@ export interface RouterStateUrl { params: Params; queryParams: Params; } +@Injectable() export class CustomRouterStateSerializer implements RouterStateSerializer { serialize(routerState: RouterStateSnapshot): RouterStateUrl { @@ -99,7 +101,7 @@ export class CustomRouterStateSerializer LoginModule, HomeModule, DashboardModule, - StoreRouterConnectingModule.forRoot(), // Create action for router navigation + StoreRouterConnectingModule.forRoot({ serializer: DefaultRouterStateSerializer }), // Create action for router navigation AboutModule, CustomImportModule, XSRFModule, @@ -125,8 +127,10 @@ export class AppModule { eventService: GlobalEventService, private userFavoriteManager: UserFavoriteManager, private favoritesConfigMapper: FavoritesConfigMapper, + ech: EntityCatalogHelper ) { - EntityActionDispatcher.initialize(this.store); + EntityCatalogHelpers.SetEntityCatalogHelper(ech); + eventService.addEventConfig({ eventTriggered: (state: GeneralEntityAppState) => new GlobalEventData(!state.dashboard.timeoutSession), message: 'Timeout session is disabled - this is considered a security risk.', diff --git a/src/frontend/packages/core/src/base-entity-schemas.ts b/src/frontend/packages/core/src/base-entity-schemas.ts index 4242afd616..19da225c8b 100644 --- a/src/frontend/packages/core/src/base-entity-schemas.ts +++ b/src/frontend/packages/core/src/base-entity-schemas.ts @@ -7,6 +7,8 @@ import { } from '../../store/src/helpers/entity-factory'; import { EntitySchema } from '../../store/src/helpers/entity-schema'; +export const metricEntityType = 'metrics'; + export const STRATOS_ENDPOINT_TYPE = 'stratos'; export const ENDPOINT_TYPE = 'endpoint'; diff --git a/src/frontend/packages/core/src/base-entity-types.ts b/src/frontend/packages/core/src/base-entity-types.ts index 37f2c840ac..15cee657b0 100644 --- a/src/frontend/packages/core/src/base-entity-types.ts +++ b/src/frontend/packages/core/src/base-entity-types.ts @@ -1,4 +1,7 @@ -import { StratosCatalogEndpointEntity, StratosCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity'; +import { + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { addOrUpdateUserFavoriteMetadataReducer, deleteUserFavoriteMetadataReducer, @@ -41,10 +44,10 @@ class DefaultEndpointCatalogEntity extends StratosCatalogEntity { type: endpointEntitySchema.entityType, endpoint: stratosType, }, { - dataReducers: [ - systemEndpointsReducer - ] - }); + dataReducers: [ + systemEndpointsReducer + ] + }); } } @@ -55,11 +58,11 @@ class UserFavoriteCatalogEntity extends StratosCatalogEntity { type: userFavoritesEntitySchema.entityType, endpoint: stratosType, }, { - dataReducers: [ - addOrUpdateUserFavoriteMetadataReducer, - deleteUserFavoriteMetadataReducer, - ] - }); + dataReducers: [ + addOrUpdateUserFavoriteMetadataReducer, + deleteUserFavoriteMetadataReducer, + ] + }); } } diff --git a/src/frontend/packages/core/src/core/core.module.ts b/src/frontend/packages/core/src/core/core.module.ts index 79a776828f..e3ee91c394 100644 --- a/src/frontend/packages/core/src/core/core.module.ts +++ b/src/frontend/packages/core/src/core/core.module.ts @@ -5,7 +5,10 @@ import { Title } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; import { MomentModule } from 'ngx-moment'; +import { EntityCatalogHelper } from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; import { EntityServiceFactory } from '../../../store/src/entity-service-factory.service'; +import { EntityMonitorFactory } from '../../../store/src/monitors/entity-monitor.factory.service'; +import { PaginationMonitorFactory } from '../../../store/src/monitors/pagination-monitor.factory'; import { NoContentMessageComponent } from '../shared/components/no-content-message/no-content-message.component'; import { RecentEntitiesComponent } from '../shared/components/recent-entities/recent-entities.component'; import { UserAvatarComponent } from './../shared/components/user-avatar/user-avatar.component'; @@ -76,6 +79,10 @@ import { WindowRef } from './window-ref/window-ref.service'; LoggerService, EndpointsService, UserService, + EntityServiceFactory, + EntityMonitorFactory, + EntityCatalogHelper, + PaginationMonitorFactory, UserProfileService, EntityServiceFactory, CurrentUserPermissionsService, diff --git a/src/frontend/packages/core/src/core/current-user-permissions.checker.ts b/src/frontend/packages/core/src/core/current-user-permissions.checker.ts index f0050f0832..1d50f368f4 100644 --- a/src/frontend/packages/core/src/core/current-user-permissions.checker.ts +++ b/src/frontend/packages/core/src/core/current-user-permissions.checker.ts @@ -2,9 +2,8 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; -import { - createCfFeatureFlagFetchAction, -} from '../../../cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { CFFeatureFlagTypes, IFeatureFlag } from '../../../cloud-foundry/src/cf-api.types'; +import { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { getCurrentUserCFEndpointHasScope, getCurrentUserCFEndpointRolesState, @@ -16,15 +15,11 @@ import { ISpacesRoleState, } from '../../../cloud-foundry/src/store/types/cf-current-user-roles.types'; import { GeneralEntityAppState } from '../../../store/src/app-state'; -import { PaginationMonitor } from '../../../store/src/monitors/pagination-monitor'; -import { getPaginationObservables } from '../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { getCurrentUserStratosHasScope, getCurrentUserStratosRole, } from '../../../store/src/selectors/current-user-role.selectors'; import { connectedEndpointsSelector } from '../../../store/src/selectors/endpoint.selectors'; -import { CFFeatureFlagTypes } from '../shared/components/cf-auth/cf-auth.types'; -import { IFeatureFlag } from './cf-api.types'; import { PermissionConfig, PermissionStrings, @@ -194,25 +189,10 @@ export class CurrentUserPermissionsChecker { const endpointGuids$ = this.getEndpointGuidObservable(endpointGuid); return endpointGuids$.pipe( switchMap(guids => { - const createFFObs = guid => { + const createFFObs = guid => // For admins we don't have the ff list which is usually fetched right at the start, // so this can't be a pagination monitor on its own (which doesn't fetch if list is missing) - const action = createCfFeatureFlagFetchAction(guid); - return getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: new PaginationMonitor( - this.store, - action.paginationKey, - action, - true - ) - }, - true - ).entities$; - }; - + cfEntityCatalog.featureFlag.store.getPaginationService(guid).entities$; return combineLatest(guids.map(createFFObs)); }), map(endpointFeatureFlags => endpointFeatureFlags.some(featureFlags => this.checkFeatureFlag(featureFlags, permission))), diff --git a/src/frontend/packages/core/src/core/current-user-permissions.config.ts b/src/frontend/packages/core/src/core/current-user-permissions.config.ts index df9cdd2fa1..3781f1ca24 100644 --- a/src/frontend/packages/core/src/core/current-user-permissions.config.ts +++ b/src/frontend/packages/core/src/core/current-user-permissions.config.ts @@ -1,4 +1,4 @@ -import { CFFeatureFlagTypes } from '../shared/components/cf-auth/cf-auth.types'; +import { CFFeatureFlagTypes } from '../../../cloud-foundry/src/cf-api.types'; export enum CurrentUserPermissions { APPLICATION_VIEW = 'view.application', diff --git a/src/frontend/packages/core/src/core/current-user-permissions.service.spec.ts b/src/frontend/packages/core/src/core/current-user-permissions.service.spec.ts index a9b23771ca..3e4184df98 100644 --- a/src/frontend/packages/core/src/core/current-user-permissions.service.spec.ts +++ b/src/frontend/packages/core/src/core/current-user-permissions.service.spec.ts @@ -2,6 +2,7 @@ import { TestBed } from '@angular/core/testing'; import { createBasicStoreModule, createEntityStoreState, TestStoreEntity } from '@stratos/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'; @@ -12,10 +13,9 @@ 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 { AppTestModule } from '../../test-framework/core-test.helper'; import { endpointEntitySchema } from '../base-entity-schemas'; import { generateStratosEntities } from '../base-entity-types'; -import { CFFeatureFlagTypes } from '../shared/components/cf-auth/cf-auth.types'; -import { IFeatureFlag } from './cf-api.types'; import { CurrentUserPermissions, PermissionConfig, @@ -928,6 +928,7 @@ describe('CurrentUserPermissionsService', () => { ] }, createBasicStoreModule(createStoreState()), + AppTestModule ], }); @@ -984,6 +985,19 @@ describe('CurrentUserPermissionsService', () => { ).subscribe(); }); + it('should allow if feature flag with cf', done => { + service.can( + [new PermissionConfig(PermissionTypes.FEATURE_FLAG, CFFeatureFlagTypes.private_domain_creation)], + 'c80420ca-204b-4879-bf69-b6b7a202ad87' + ).pipe( + tap(can => { + expect(can).toBe(false); + done(); + }), + first() + ).subscribe(); + }); + it('should not allow if no feature flag', done => { service.can( [new PermissionConfig(PermissionTypes.FEATURE_FLAG, CFFeatureFlagTypes.user_org_creation)], diff --git a/src/frontend/packages/core/src/core/endpoints.service.ts b/src/frontend/packages/core/src/core/endpoints.service.ts index 51749fccf5..7160d50652 100644 --- a/src/frontend/packages/core/src/core/endpoints.service.ts +++ b/src/frontend/packages/core/src/core/endpoints.service.ts @@ -6,7 +6,7 @@ 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.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; 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'; @@ -138,8 +138,11 @@ export class EndpointsService implements CanActivate { map(ep => { return Object.values(ep) .filter(endpoint => { + if (endpoint.cnsi_type !== type) { + return; + } const epType = entityCatalog.getEndpoint(endpoint.cnsi_type, endpoint.sub_type).definition; - return endpoint.cnsi_type === type && (epType.unConnectable || endpoint.connectionStatus === 'connected'); + return epType.unConnectable || endpoint.connectionStatus === 'connected'; }); }) ); 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 f0e12ff6c5..5aee8a1959 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,12 +2,12 @@ import { OverlayContainer } from '@angular/cdk/overlay'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BehaviorSubject, of } from 'rxjs'; +import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { IFavoriteMetadata, UserFavorite } from '../../../../store/src/types/user-favorites.types'; import { BaseTestModulesNoShared } from '../../../test-framework/core-test.helper'; import { ConfirmationDialogService } from '../../shared/components/confirmation-dialog.service'; import { DialogConfirmComponent } from '../../shared/components/dialog-confirm/dialog-confirm.component'; import { FavoritesConfigMapper } from '../../shared/components/favorites-meta-card/favorite-config-mapper'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { UserFavoriteManager } from '../user-favorite-manager'; import { EntityFavoriteStarComponent } from './entity-favorite-star.component'; @@ -35,7 +35,7 @@ describe('EntityFavoriteStarComponent', () => { declarations: [ DialogConfirmComponent ], - imports: [...BaseTestModulesNoShared, ], + imports: [...BaseTestModulesNoShared,], }) .compileComponents(); })); 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 33664e86b5..82b7a305ff 100644 --- a/src/frontend/packages/core/src/core/extension/extension-service.ts +++ b/src/frontend/packages/core/src/core/extension/extension-service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, NgModule, ModuleWithProviders } from '@angular/core'; import { ActivatedRoute, Route, Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; @@ -97,7 +97,7 @@ function addExtensionTab(tab: StratosTabType, target: any, props: StratosTabMeta }); extensionMetadata.tabs[tab].push({ ...props - }); + }); } function addExtensionAction(action: StratosActionType, target: any, props: StratosActionMetadata) { @@ -113,13 +113,23 @@ function addExtensionAction(action: StratosActionType, target: any, props: Strat } // Injectable Extension Service -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class ExtensionService { public metadata = extensionMetadata; constructor(private router: Router) { } + // 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 { + return { + ngModule: ExtEmptyModule + }; + } + /** * Initialize the extensions - to be invoked in the AppModule */ @@ -184,3 +194,7 @@ export function getTabsFromExtensions(tabType: StratosTabType): IPageSideNavTab[ export function getActionsFromExtensions(actionType: StratosActionType): StratosActionMetadata[] { return extensionMetadata.actions[actionType] || []; } + +// Empty module used to support the registration of Extension Components +@NgModule() +export class ExtEmptyModule { } diff --git a/src/frontend/packages/core/src/core/md.module.ts b/src/frontend/packages/core/src/core/md.module.ts index e7d83f0e50..0e401fd3a8 100644 --- a/src/frontend/packages/core/src/core/md.module.ts +++ b/src/frontend/packages/core/src/core/md.module.ts @@ -1,4 +1,4 @@ -import 'hammerjs'; + import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; diff --git a/src/frontend/packages/core/src/core/user-favorite-helpers.ts b/src/frontend/packages/core/src/core/user-favorite-helpers.ts index 484869305e..6be08fe176 100644 --- a/src/frontend/packages/core/src/core/user-favorite-helpers.ts +++ b/src/frontend/packages/core/src/core/user-favorite-helpers.ts @@ -1,27 +1,25 @@ -import { CfAPIResource } from '../../../cloud-foundry/src/store/types/cf-api.types'; -import { EndpointModel } from '../../../store/src/types/endpoint.types'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { IEntityMetadata } from '../../../store/src/entity-catalog/entity-catalog.types'; import { IFavoriteMetadata, UserFavorite } from '../../../store/src/types/user-favorites.types'; import { FavoritesConfigMapper } from '../shared/components/favorites-meta-card/favorite-config-mapper'; -import { IEntityMetadata } from '../../../store/src/entity-catalog/entity-catalog.types'; export function isEndpointTypeFavorite(favorite: UserFavorite) { return !favorite.entityId; } -// TODO: Move cf specific code to cf package - #3769 -export function getFavoriteFromCfEntity( +// Uses the endpoint definition to get the helper that can look up an entitty +export function getFavoriteFromEntity( entity, entityKey: string, - favoritesConfigMapper: FavoritesConfigMapper -) { - if (isCfEntity(entity as CfAPIResource)) { - return favoritesConfigMapper.getFavoriteFromEntity( - entityKey, - 'cf', - entity.entity.cfGuid, - entity - ); + favoritesConfigMapper: FavoritesConfigMapper, + entityType: string +): UserFavorite { + // Use entity catalog to get favorite for the given endpoint type + const endpoint = entityCatalog.getEndpoint(entityType); + if (endpoint && endpoint.definition && endpoint.definition.favoriteFromEntity) { + return endpoint.definition.favoriteFromEntity(entity, entityKey, favoritesConfigMapper); } + return null; } @@ -37,12 +35,3 @@ export function deriveEndpointFavoriteFromFavorite(favorite: UserFavorite = Pick>; +export type OptionalKeys = Exclude<{ + [K in keyof T]: T extends Record + ? K + : never +}[keyof T], undefined> + + +export type NonOptionalKeys = Exclude<{ + [K in keyof T]: T extends Record + ? K + : never +}[keyof T], undefined> + +export type NeverKeys = Exclude<{ + [K in keyof T]: T[K] extends never + ? K + : never +}[keyof T], undefined> + + +/** + * Remove keys such as typed indexes (i.e. [key: string]) + * For magic see + * - https://github.com/Microsoft/TypeScript/issues/25987#issuecomment-441224690 + * - https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-414808995 + */ +export type KnownKeys = { + [K in keyof T]: string extends K ? never : number extends K ? never : K +} extends { [_ in keyof T]: infer U } ? ({} extends U ? never : U) : never; + +/** + * Pick all properties who's function has the specified return type U + */ +export type FilteredByReturnType any }, U> = { + [P in keyof T]: ReturnType extends U ? T[P] : never +}; + +/** + * Pick all properties who's function do not have the specified return type U + */ +export type FilteredByNotReturnType any }, U> = { + [P in keyof T]: ReturnType extends U ? never : T[P] +}; + +// Note - Adding }[keyof T] to [P in keyof T] types should filter out properties of type `never`, however this fails with generics! +export type FilteredByValueType any }, U> = { + [P in keyof T]: T[P] extends U ? never : T[P] +}; + export const urlValidationExpression = '^' + diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts deleted file mode 100644 index 64d39dd41e..0000000000 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Subscription } from 'rxjs'; -import { filter, map, pairwise } from 'rxjs/operators'; - -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; -import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; -import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; -import { quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; - - -@Component({ - selector: 'app-create-quota-step', - templateUrl: './create-quota-step.component.html', - styleUrls: ['./create-quota-step.component.scss'] -}) -export class CreateQuotaStepComponent { - - quotasSubscription: Subscription; - cfGuid: string; - quotaForm: FormGroup; - - @ViewChild('form', { static: true }) - form: QuotaDefinitionFormComponent; - - constructor( - private store: Store, - private activatedRoute: ActivatedRoute, - ) { - this.cfGuid = this.activatedRoute.snapshot.params.endpointId; - } - - validate = () => !!this.form && this.form.valid(); - - submit: StepOnNextFunction = () => { - const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - entityConfig.actionDispatchManager.dispatchCreate(formValues.name, this.cfGuid, formValues); - return entityConfig.getEntityMonitor(this.store, formValues.name).entityRequest$.pipe( - pairwise(), - filter(([oldV, newV]) => oldV.creating && !newV.creating), - map(([, newV]) => newV), - map(requestInfo => ({ - success: !requestInfo.error, - redirect: !requestInfo.error, - message: requestInfo.error ? `Failed to create quota: ${requestInfo.message}` : '' - })) - ); - } -} diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts deleted file mode 100644 index 5bb4a1ef34..0000000000 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Component, OnDestroy, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; -import { filter, first, map, pairwise, tap } from 'rxjs/operators'; - -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - GetQuotaDefinition, - UpdateQuotaDefinition, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; -import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { AppState } from '../../../../../../store/src/app-state'; -import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { safeUnsubscribe } from '../../../../core/utils.service'; -import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; -import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; -import { quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; - - -@Component({ - selector: 'app-edit-quota-step', - templateUrl: './edit-quota-step.component.html', - styleUrls: ['./edit-quota-step.component.scss'], - providers: [ - getActiveRouteCfOrgSpaceProvider - ] -}) -export class EditQuotaStepComponent implements OnDestroy { - - cfGuid: string; - quotaGuid: string; - quotaDefinition$: Observable>; - quotaSubscription: Subscription; - quota: IQuotaDefinition; - - @ViewChild('form', { static: false }) - form: QuotaDefinitionFormComponent; - - constructor( - private store: Store, - private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, - activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - ) { - this.cfGuid = activeRouteCfOrgSpace.cfGuid; - this.quotaGuid = this.activatedRoute.snapshot.params.quotaId; - - this.fetchQuotaDefinition(); - } - - fetchQuotaDefinition() { - this.quotaDefinition$ = this.entityServiceFactory.create>( - this.quotaGuid, - new GetQuotaDefinition(this.quotaGuid, this.cfGuid), - ).waitForEntity$.pipe( - first(), - map(data => data.entity), - tap((resource) => this.quota = resource.entity) - ); - - this.quotaSubscription = this.quotaDefinition$.subscribe(); - } - - validate = () => this.form && this.form.valid(); - - submit: StepOnNextFunction = () => { - const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - entityConfig.actionDispatchManager.dispatchUpdate(this.quotaGuid, this.cfGuid, formValues); - return entityConfig - .getEntityMonitor(this.store, this.quotaGuid) - .getUpdatingSection(UpdateQuotaDefinition.UpdateExistingQuota).pipe( - pairwise(), - filter(([oldV, newV]) => oldV.busy && !newV.busy), - map(([, newV]) => newV), - map(requestInfo => ({ - success: !requestInfo.error, - redirect: !requestInfo.error, - message: requestInfo.error ? `Failed to update quota: ${requestInfo.message}` : '' - })) - ); - } - - ngOnDestroy() { - safeUnsubscribe(this.quotaSubscription); - } -} diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts deleted file mode 100644 index cd832da790..0000000000 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Component, OnDestroy, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; -import { filter, map, pairwise, tap } from 'rxjs/operators'; - -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - GetSpaceQuotaDefinition, - UpdateSpaceQuotaDefinition, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { - SpaceQuotaDefinitionActionBuilders, -} from '../../../../../../cloud-foundry/src/entity-action-builders/space-quota.action-builders'; -import { AppState } from '../../../../../../store/src/app-state'; -import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { safeUnsubscribe } from '../../../../core/utils.service'; -import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; -import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; -import { spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; - - -@Component({ - selector: 'app-edit-space-quota-step', - templateUrl: './edit-space-quota-step.component.html', - styleUrls: ['./edit-space-quota-step.component.scss'] -}) -export class EditSpaceQuotaStepComponent implements OnDestroy { - - spaceQuotaSubscription: Subscription; - cfGuid: string; - spaceQuotaGuid: string; - allQuotas: string[]; - spaceQuotaDefinition$: Observable>; - quota: IQuotaDefinition; - - @ViewChild('form', { static: false }) - form: SpaceQuotaDefinitionFormComponent; - - constructor( - private store: Store, - private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, - ) { - this.cfGuid = this.activatedRoute.snapshot.params.endpointId; - this.spaceQuotaGuid = this.activatedRoute.snapshot.params.quotaId; - - this.fetchQuotaDefinition(); - } - - fetchQuotaDefinition() { - this.spaceQuotaDefinition$ = this.entityServiceFactory.create>( - this.spaceQuotaGuid, - new GetSpaceQuotaDefinition(this.spaceQuotaGuid, this.cfGuid), - ).waitForEntity$.pipe( - map(data => data.entity), - tap((resource) => this.quota = resource.entity) - ); - - this.spaceQuotaSubscription = this.spaceQuotaDefinition$.subscribe(); - } - - validate = () => !!this.form && this.form.valid(); - - submit: StepOnNextFunction = () => { - const formValues = this.form.formGroup.value; - const action = new UpdateSpaceQuotaDefinition(this.spaceQuotaGuid, this.cfGuid, formValues); - this.store.dispatch(action); - - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceQuotaEntityType); - entityConfig.actionDispatchManager.dispatchUpdate(this.spaceQuotaGuid, this.cfGuid, formValues); - - return entityConfig - .getEntityMonitor(this.store, this.spaceQuotaGuid) - .getUpdatingSection(UpdateSpaceQuotaDefinition.UpdateExistingSpaceQuota) - .pipe( - pairwise(), - filter(([oldV, newV]) => oldV.busy && !newV.busy), - map(([, newV]) => newV), - map(requestInfo => ({ - success: !requestInfo.error, - redirect: !requestInfo.error, - message: requestInfo.error ? `Failed to update space quota: ${requestInfo.message}` : '' - })) - ); - } - - ngOnDestroy() { - safeUnsubscribe(this.spaceQuotaSubscription); - } -} 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 91e4819fba..9aa632989f 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 @@ -1,26 +1,19 @@ import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { Portal } from '@angular/cdk/portal'; import { AfterViewInit, Component, NgZone, OnDestroy, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; -import { MatDrawer } from '@angular/material'; +import { MatDrawer } from '@angular/material/sidenav'; import { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Route, Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from 'frontend/packages/store/src/entity-catalog/entity-catalog.types'; import { combineLatest, Observable, of, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map, startWith, withLatestFrom } from 'rxjs/operators'; import { GetCurrentUsersRelations } from '../../../../../cloud-foundry/src/actions/permissions.actions'; -import { cfInfoEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cloud-foundry/src/cf-types'; -import { - CfInfoDefinitionActionBuilders, -} from '../../../../../cloud-foundry/src/entity-action-builders/cf-info.action-builders'; import { CloseSideNav, DisableMobileNav, EnableMobileNav } from '../../../../../store/src/actions/dashboard-actions'; import { GetUserFavoritesAction } from '../../../../../store/src/actions/user-favourites-actions/get-user-favorites-action'; 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 { EndpointHealthCheck } from '../../../../endpoints-health-checks'; import { TabNavService } from '../../../../tab-nav.service'; import { CustomizationService } from '../../../core/customizations.types'; import { EndpointsService } from '../../../core/endpoints.service'; @@ -54,9 +47,9 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit sideNavTabs: SideNavItem[] = this.getNavigationRoutes(); sideNaveMode = 'side'; - @ViewChild('previewPanelContainer', { read: ViewContainerRef, static: false }) previewPanelContainer: ViewContainerRef; + @ViewChild('previewPanelContainer', { read: ViewContainerRef }) previewPanelContainer: ViewContainerRef; - @ViewChild('content', { static: false }) public content; + @ViewChild('content') public content; constructor( public pageHeaderService: PageHeaderService, @@ -103,7 +96,7 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit .subscribe(isMobile => isMobile ? this.store.dispatch(new EnableMobileNav()) : this.store.dispatch(new DisableMobileNav())); } - @ViewChild('sidenav', { static: false }) set sidenav(drawer: MatDrawer) { + @ViewChild('sidenav') set sidenav(drawer: MatDrawer) { this.drawer = drawer; if (!this.closeSub) { // We need this for mobile to ensure the state is synced when the dashboard is closed by clicking on the backdrop. @@ -142,13 +135,14 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit ), this.tabNavService.tabSubNav$ ); - // TODO: Move cf code out to cf module #3849 - this.endpointsService.registerHealthCheck( - new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => { - entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfInfoEntityType) - .actionDispatchManager.dispatchGet(endpoint.guid); - }) - ); + + // Register all health checks for endpoint types that support this + entityCatalog.getAllEndpointTypes().forEach(epType => { + if (epType && epType.definition && epType.definition.healthCheck) { + this.endpointsService.registerHealthCheck(epType.definition.healthCheck); + } + }); + this.dispatchRelations(); this.store.dispatch(new GetUserFavoritesAction()); } @@ -156,6 +150,7 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit ngOnDestroy() { this.mobileSub.unsubscribe(); this.closeSub.unsubscribe(); + this.sidePanelService.unsetContainer(); } isNoMarginView(route: ActivatedRouteSnapshot): boolean { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts index 978f098196..13bddabaaa 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel, SystemSharedUserGuid } from '../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts index d10c9144e8..5251a66479 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts @@ -5,7 +5,7 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { first, map } from 'rxjs/operators'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; import { BrowserStandardEncoder } from '../../../helper'; import { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts index 1d24656803..3ad6856b48 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts @@ -7,7 +7,7 @@ import { filter, first, map } from 'rxjs/operators'; import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.actions'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts index 2904f6024d..c3483dca50 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/restore-endpoints/restore-endpoints.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { MatCheckboxChange } from '@angular/material'; +import { MatCheckboxChange } from '@angular/material/checkbox'; import { Store } from '@ngrx/store'; import { Observable, of, Subject } from 'rxjs'; import { first, map } from 'rxjs/operators'; diff --git a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts index 185456b739..fc355c4928 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts @@ -15,7 +15,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointAuthTypeConfig, IAuthForm, IEndpointAuthComponent } from '../../../core/extension/extension-types'; import { safeUnsubscribe } from '../../../core/utils.service'; import { ConnectEndpointConfig, ConnectEndpointData, ConnectEndpointService } from '../connect.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/connect.service.ts b/src/frontend/packages/core/src/features/endpoints/connect.service.ts index 102df34440..015ff5b14d 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect.service.ts @@ -17,7 +17,7 @@ import { GetSystemInfo } from '../../../../store/src/actions/system.actions'; import { EndpointOnlyAppState } from '../../../../store/src/app-state'; import { EndpointsEffect } from '../../../../store/src/effects/endpoint.effects'; import { SystemEffects } from '../../../../store/src/effects/system.effects'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../store/src/helpers/entity-factory'; import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; import { selectEntity, selectRequestInfo, selectUpdateInfo } from '../../../../store/src/selectors/api.selectors'; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts index 38ed86cbca..85fedb80c1 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts @@ -5,7 +5,7 @@ import { first, map } from 'rxjs/operators'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; import { selectSessionData } from '../../../../../../store/src/reducers/auth.reducer'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { BASE_REDIRECT_QUERY } from '../../../../shared/components/stepper/stepper.types'; import { TileConfigManager } from '../../../../shared/components/tile/tile-selector.helpers'; import { ITileConfig, ITileData } from '../../../../shared/components/tile/tile-selector.types'; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts index 1a576df5dd..a046dc6b62 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts @@ -10,8 +10,10 @@ import { GetAllEndpoints, RegisterEndpoint } from '../../../../../../store/src/a import { ShowSnackBar } from '../../../../../../store/src/actions/snackBar.actions'; import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; import { EndpointsEffect } from '../../../../../../store/src/effects/endpoint.effects'; -import { StratosCatalogEndpointEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosCatalogEndpointEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { getAPIRequestDataState, selectUpdateInfo } from '../../../../../../store/src/selectors/api.selectors'; import { selectPaginationState } from '../../../../../../store/src/selectors/pagination.selectors'; @@ -42,11 +44,11 @@ export class CreateEndpointCfStep1Component implements IStepperStep, AfterConten @ViewChild('nameField', { static: true }) nameField: NgModel; @ViewChild('urlField', { static: true }) urlField: NgModel; @ViewChild('skipSllField', { static: true }) skipSllField: NgModel; - @ViewChild('ssoAllowedField', { static: false }) ssoAllowedField: NgModel; + @ViewChild('ssoAllowedField') ssoAllowedField: NgModel; // Optional Client ID and Client Secret - @ViewChild('clientIDField', { static: false }) clientIDField: NgModel; - @ViewChild('clientSecretField', { static: false }) clientSecretField: NgModel; + @ViewChild('clientIDField') clientIDField: NgModel; + @ViewChild('clientSecretField') clientSecretField: NgModel; urlValidation: string; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts index 9a2d225ea3..1bd0f9c07c 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { getIdFromRoute } from '../../../core/utils.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.spec.ts index 7a47fcc353..2ee96995c5 100644 --- a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.spec.ts @@ -1,24 +1,43 @@ +import { CommonModule } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; -import { EditOrganizationStepComponent } from './../../../../../../cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component'; -import { ActiveRouteCfOrgSpace } from './../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider } from '../../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; +import { createBasicStoreModule } from '../../../../../../store/testing/public-api'; +import { CoreTestingModule } from '../../../../../test-framework/core-test.modules'; +import { CoreModule } from '../../../../core/core.module'; +import { SharedModule } from './../../../../shared/shared.module'; +import { EditEndpointStepComponent } from './edit-endpoint-step.component'; -describe('EditOrganizationStepComponent', () => { - let component: EditOrganizationStepComponent; - let fixture: ComponentFixture; +describe('EditEndpointStepComponent', () => { + let component: EditEndpointStepComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [EditOrganizationStepComponent], - imports: generateCfBaseTestModules(), - providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider()] + declarations: [EditEndpointStepComponent], + imports: [ + CoreTestingModule, + createBasicStoreModule(), + CommonModule, + CoreModule, + SharedModule, + ], + providers: [ + { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { id: 'guid' } + } + } + }, + ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(EditOrganizationStepComponent); + fixture = TestBed.createComponent(EditEndpointStepComponent); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -26,4 +45,8 @@ describe('EditOrganizationStepComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + afterAll(() => { + component.ngOnDestroy(); + }); }); diff --git a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts index ce966903ba..1376e3e6b7 100644 --- a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts @@ -1,20 +1,24 @@ -import { ActivatedRoute } from '@angular/router'; import { Component, OnDestroy } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; -import { filter, map, first, pairwise, startWith } from 'rxjs/operators'; -import { EndpointModel } from './../../../../../../store/src/types/endpoint.types'; -import { UpdateEndpoint } from './../../../../../../store/src/actions/endpoint.actions'; -import { IStratosEndpointDefinition, EntityCatalogSchemas } from './../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { entityCatalog } from './../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { endpointEntitiesSelector } from './../../../../../../store/src/selectors/endpoint.selectors'; -import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; +import { filter, first, map, pairwise, switchMap } from 'rxjs/operators'; + +import { AppState } from '../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { selectUpdateInfo } from '../../../../../../store/src/selectors/api.selectors'; -import { safeUnsubscribe, getIdFromRoute } from './../../../../core/utils.service'; +import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { getFullEndpointApiUrl, getSSOClientRedirectURI } from '../../endpoint-helpers'; +import { UpdateEndpoint } from './../../../../../../store/src/actions/endpoint.actions'; +import { + EntityCatalogSchemas, + IStratosEndpointDefinition, +} from './../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { endpointEntitiesSelector } from './../../../../../../store/src/selectors/endpoint.selectors'; +import { EndpointModel } from './../../../../../../store/src/types/endpoint.types'; +import { getIdFromRoute, safeUnsubscribe } from './../../../../core/utils.service'; import { IStepperStep } from './../../../../shared/components/stepper/step/step.component'; -import { CFAppState } from 'frontend/packages/cloud-foundry/src/cf-app-state'; interface EndpointModelMap { [id: string]: EndpointModel; @@ -42,7 +46,7 @@ export class EditEndpointStepComponent implements OnDestroy, IStepperStep { setClientInfo = false; constructor( - private store: Store, + private store: Store, activatedRoute: ActivatedRoute, ) { this.editEndpoint = new FormGroup({ @@ -78,7 +82,10 @@ export class EditEndpointStepComponent implements OnDestroy, IStepperStep { ); // Fill the form in with the endpoint data - this.endpoint$.pipe(first()).subscribe(endpoint => { + this.endpoint$.pipe( + filter(ep => !!ep), + first() + ).subscribe(endpoint => { this.setAdvancedFields(endpoint); this.editEndpoint.setValue({ name: endpoint.name, @@ -117,29 +124,36 @@ export class EditEndpointStepComponent implements OnDestroy, IStepperStep { } onNext: StepOnNextFunction = () => { - const action = new UpdateEndpoint( - this.endpointID, - this.editEndpoint.value.name, - this.editEndpoint.value.skipSSL, - this.editEndpoint.value.setClientInfo, - this.editEndpoint.value.clientID, - this.editEndpoint.value.clientSecret, - this.editEndpoint.value.allowSSO, - ); - - this.store.dispatch(action); - return this.store.select(selectUpdateInfo('stratosEndpoint', this.endpointID, 'updating')).pipe( - pairwise(), - filter(([oldV, newV]) => oldV.busy && !newV.busy), - map(([, newV]) => newV), - map(o => { - return { - success: !o.error, - message: o.message, - redirect: !o.error - }; + return this.endpoint$.pipe( + first(), + switchMap(endpoint => { + const action = new UpdateEndpoint( + endpoint.cnsi_type, + this.endpointID, + this.editEndpoint.value.name, + this.editEndpoint.value.skipSSL, + this.editEndpoint.value.setClientInfo, + this.editEndpoint.value.clientID, + this.editEndpoint.value.clientSecret, + this.editEndpoint.value.allowSSO, + ); + + this.store.dispatch(action); + + return this.store.select(selectUpdateInfo('stratosEndpoint', this.endpointID, 'updating')).pipe( + pairwise(), + filter(([oldV, newV]) => oldV.busy && !newV.busy), + map(([, newV]) => newV), + map(o => { + return { + success: !o.error, + message: o.message, + redirect: !o.error + }; + }) + ) }) - ); + ) } ngOnDestroy(): void { @@ -148,9 +162,10 @@ export class EditEndpointStepComponent implements OnDestroy, IStepperStep { // Only show the Client ID and Client Secret fields if the endpoint type is Cloud Foundry setAdvancedFields(endpoint: any) { - this.showAdvancedFields = endpoint.cnsi_type === 'cf'; + const isCloudFoundry = endpoint && endpoint.cnsi_type === 'cf'; + this.showAdvancedFields = isCloudFoundry; // Only allow SSL if the endpoint type is Cloud Foundry - this.endpointTypeSupportsSSO = endpoint.cnsi_type === 'cf'; + this.endpointTypeSupportsSSO = isCloudFoundry; } } diff --git a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint.component.spec.ts b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint.component.spec.ts index c3db68ed45..9b94a55029 100644 --- a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint.component.spec.ts +++ b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint.component.spec.ts @@ -1,28 +1,49 @@ +import { CommonModule } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; -import { ActiveRouteCfOrgSpace } from './../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; -import { EditOrganizationStepComponent } from './../../../../../cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component'; -import { EditOrganizationComponent } from './../../../../../cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization.component'; -import { generateCfBaseTestModules, generateTestCfEndpointServiceProvider } from '../../../../../cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper'; - +import { createBasicStoreModule } from '../../../../../store/testing/public-api'; import { TabNavService } from '../../../../tab-nav.service'; +import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; +import { CoreModule } from '../../../core/core.module'; +import { SharedModule } from '../../../shared/shared.module'; +import { EditEndpointStepComponent } from './edit-endpoint-step/edit-endpoint-step.component'; +import { EditEndpointComponent } from './edit-endpoint.component'; -describe('EditOrganizationComponent', () => { - let component: EditOrganizationComponent; - let fixture: ComponentFixture; +describe('EditEndpointComponent', () => { + let component: EditEndpointComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [EditOrganizationComponent, EditOrganizationStepComponent], - imports: generateCfBaseTestModules(), - providers: [ActiveRouteCfOrgSpace, generateTestCfEndpointServiceProvider(), TabNavService] - + declarations: [EditEndpointComponent, EditEndpointStepComponent], + imports: [ + CoreTestingModule, + createBasicStoreModule(), + CommonModule, + CoreModule, + SharedModule, + RouterTestingModule, + ], + providers: [ + { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { id: 'guid' }, + queryParams: { breadcrumbs: '' } + } + } + }, + TabNavService + ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(EditOrganizationComponent); + fixture = TestBed.createComponent(EditEndpointComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/frontend/packages/core/src/features/metrics/metrics.helpers.ts b/src/frontend/packages/core/src/features/metrics/metrics.helpers.ts index 08eb2e060b..fc31d4b577 100644 --- a/src/frontend/packages/core/src/features/metrics/metrics.helpers.ts +++ b/src/frontend/packages/core/src/features/metrics/metrics.helpers.ts @@ -2,7 +2,7 @@ import { Observable, of as observableOf } from 'rxjs'; import { StratosStatus } from '../../shared/shared.types'; import { EndpointIcon, getFullEndpointApiUrl } from '../endpoints/endpoint-helpers'; -import { entityCatalog } from './../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from './../../../../store/src/entity-catalog/entity-catalog'; import { MetricsEndpointProvider } from './services/metrics-service'; // Info for an endpoint that a metrics endpoint provides for diff --git a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts index 090a536487..2fb80c826d 100644 --- a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts +++ b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts @@ -78,7 +78,7 @@ export class MetricsComponent { // Breadcrumbs this.breadcrumbs$ = this.metricsEndpoint$.pipe( - map(() => ([ { breadcrumbs: [ { value: 'Endpoints', routerLink: `/endpoints` } ] } ])), + map(() => ([{ breadcrumbs: [{ value: 'Endpoints', routerLink: `/endpoints` }] }])), first() ); diff --git a/src/frontend/packages/core/src/logged-in.service.ts b/src/frontend/packages/core/src/logged-in.service.ts index 7db8ed0ddc..b083dd237c 100644 --- a/src/frontend/packages/core/src/logged-in.service.ts +++ b/src/frontend/packages/core/src/logged-in.service.ts @@ -5,8 +5,8 @@ import { Store } from '@ngrx/store'; import { fromEvent, interval, merge, Subscription } from 'rxjs'; import { tap, withLatestFrom } from 'rxjs/operators'; -import { CFAppState } from '../../cloud-foundry/src/cf-app-state'; import { VerifySession } from '../../store/src/actions/auth.actions'; +import { AppState } from '../../store/src/app-state'; import { AuthState } from '../../store/src/reducers/auth.reducer'; import { selectDashboardState } from '../../store/src/selectors/dashboard.selectors'; import { DashboardState } from './../../store/src/reducers/dashboard-reducer'; @@ -17,7 +17,7 @@ import { PageVisible } from './core/page-visible'; export class LoggedInService { constructor( @Inject(DOCUMENT) private document: Document, - private store: Store, + private store: Store, private dialog: MatDialog, private ngZone: NgZone ) { diff --git a/src/frontend/packages/core/src/route-reuse-stragegy.ts b/src/frontend/packages/core/src/route-reuse-stragegy.ts index a82b053d35..d350557f57 100644 --- a/src/frontend/packages/core/src/route-reuse-stragegy.ts +++ b/src/frontend/packages/core/src/route-reuse-stragegy.ts @@ -2,8 +2,10 @@ import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from import { AppComponent } from './app.component'; import { DashboardBaseComponent } from './features/dashboard/dashboard-base/dashboard-base.component'; +import { Injectable } from "@angular/core"; +@Injectable() export class CustomReuseStrategy extends RouteReuseStrategy { shouldDetach(route: ActivatedRouteSnapshot): boolean { return false; } store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void { } diff --git a/src/frontend/packages/core/src/shared/components/app-action-monitor/app-action-monitor.component.ts b/src/frontend/packages/core/src/shared/components/app-action-monitor/app-action-monitor.component.ts index 3af4bbd2cd..2895bce18d 100644 --- a/src/frontend/packages/core/src/shared/components/app-action-monitor/app-action-monitor.component.ts +++ b/src/frontend/packages/core/src/shared/components/app-action-monitor/app-action-monitor.component.ts @@ -79,7 +79,7 @@ export class AppActionMonitorComponent implements OnInit { columnId: 'monitorState', cellComponent: TableCellRequestMonitorIconComponent, cellConfig: this.getCellConfig || defaultGetCellConfig, - cellFlex: '0 0 40px' + cellFlex: '0 0 24px' }; this.allColumns = [...this.columns, monitorColumn]; diff --git a/src/frontend/packages/core/src/shared/components/application-state/application-state.component.ts b/src/frontend/packages/core/src/shared/components/application-state/application-state.component.ts index 8a3cb8c0c5..f548f70336 100644 --- a/src/frontend/packages/core/src/shared/components/application-state/application-state.component.ts +++ b/src/frontend/packages/core/src/shared/components/application-state/application-state.component.ts @@ -2,8 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { StratosStatus } from '../../shared.types'; -import { ApplicationStateData } from './application-state.service'; +import { StratosStatus, StratosStatusMetadata } from '../../shared.types'; @Component({ selector: 'app-application-state', @@ -13,7 +12,7 @@ import { ApplicationStateData } from './application-state.service'; export class ApplicationStateComponent implements OnInit { @Input() - public state: Observable; + public state: Observable; public status$: Observable; diff --git a/src/frontend/packages/core/src/shared/components/boolean-indicator/boolean-indicator.component.ts b/src/frontend/packages/core/src/shared/components/boolean-indicator/boolean-indicator.component.ts index b5739c317a..4a544a0d27 100644 --- a/src/frontend/packages/core/src/shared/components/boolean-indicator/boolean-indicator.component.ts +++ b/src/frontend/packages/core/src/shared/components/boolean-indicator/boolean-indicator.component.ts @@ -39,14 +39,33 @@ export class BooleanIndicatorComponent { @Input() inverse = false; // Should we use a subtle display - this won't show the No option as danger (typically red) @Input() subtle = true; - @Input() type: BooleanIndicatorType; @Input() showText = true; - @Input() set isTrue(isTrue: boolean) { - const isUnknown = typeof isTrue !== 'boolean'; + private pType: BooleanIndicatorType; + @Input() + get type(): BooleanIndicatorType { + return this.pType; + } + set type(type: BooleanIndicatorType) { + this.pType = type; + this.updateBooleanOutput(); + } + + private pIsTrue: boolean; + @Input() + get isTrue(): boolean { + return this.pIsTrue; + } + set isTrue(isTrue: boolean) { + this.pIsTrue = isTrue; + this.updateBooleanOutput(); + } + + private updateBooleanOutput() { + const isUnknown = typeof this.isTrue !== 'boolean'; this.booleanOutput = this.getIconTextAndSeverity({ - isTrue, - isUnknown, + isTrue: this.isTrue, + isUnknown: isUnknown, inverse: this.inverse, subtle: this.subtle }); @@ -74,7 +93,7 @@ export class BooleanIndicatorComponent { private getIconTextAndSeverity = ( { isTrue = false, isUnknown = false, inverse = false, subtle = true }: IBooleanConfig ): IBooleanOutput => { - if (isUnknown) { + if (isUnknown || !this.type) { return { icon: this.icons.Unknown, text: 'Unknown', diff --git a/src/frontend/packages/core/src/shared/components/cards/card-number-metric/card-number-metric.component.ts b/src/frontend/packages/core/src/shared/components/cards/card-number-metric/card-number-metric.component.ts index e347f07b14..ca4bfcbc57 100644 --- a/src/frontend/packages/core/src/shared/components/cards/card-number-metric/card-number-metric.component.ts +++ b/src/frontend/packages/core/src/shared/components/cards/card-number-metric/card-number-metric.component.ts @@ -2,8 +2,8 @@ import { Component, Input, OnChanges, OnInit } from '@angular/core'; import { Store } from '@ngrx/store'; import { BehaviorSubject } from 'rxjs'; -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; +import { AppState } from '../../../../../../store/src/app-state'; import { UtilsService } from '../../../../core/utils.service'; import { StratosStatus } from '../../../shared.types'; import { determineCardStatus } from '../card-status/card-status.component'; @@ -34,7 +34,7 @@ export class CardNumberMetricComponent implements OnInit, OnChanges { status$ = new BehaviorSubject(StratosStatus.NONE); isUnlimited: boolean; - constructor(private utils: UtilsService, private store: Store) { } + constructor(private utils: UtilsService, private store: Store) { } ngOnInit() { this.format(); diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.module.ts b/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.module.ts deleted file mode 100644 index 45af97b356..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { CfAuthService } from './cf-auth.service'; - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [], - providers: [ - CfAuthService - ] -}) -export class CfAuthModule { } diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.spec.ts b/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.spec.ts deleted file mode 100644 index 312a2d8430..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { inject, TestBed } from '@angular/core/testing'; - -import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; -import { CfAuthService } from './cf-auth.service'; - -describe('CfAuthService', () => { - beforeEach(() => { - - TestBed.configureTestingModule({ - providers: [CfAuthService], - imports: [ - CoreTestingModule, - createBasicStoreModule(), - ] - }); - }); - - it('should be created', inject([CfAuthService], (service: CfAuthService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.ts b/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.ts deleted file mode 100644 index 39cd232897..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.service.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; -import { take } from 'rxjs/operators'; - -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { IRequestEntityTypeState } from '../../../../../store/src/app-state'; -import { selectSessionData } from '../../../../../store/src/reducers/auth.reducer'; -import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; -import { SessionData } from '../../../../../store/src/types/auth.types'; -import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; -import { CFAuthAction, CFAuthResource, CfAuthUserSummary, CfAuthUserSummaryMapped, CFFeatureFlags } from './cf-auth.types'; -import { CfAuthPrinciple } from './principal'; - - -/** - * NOTE - WIP - * This is the port of basic cf auth from v1. It's missing a number of things - * - Fetch the correct data, store in the store and fetch from store - * - Handling fetch wait and error - * - Calculate read-only admin and group auditor values from user scope and intergrate with principals (new, not in V1) - * - Determine org or space 'suspended' state and intergrate with principals - */ -@Injectable() -export class CfAuthService { - endpoints$: Observable>; - sessionData$: Observable; - // WIP: RC Initialise previously released promise when all init requests finished. For the time being use this, then make selector - initialised$: Observable; - // WIP: RC This should come from the store and populated using standard entity/non entity methods - featureFlags$: { - [key: string]: Observable - }; - // WIP: RC This should be in the store - principals: { - [key: string]: CfAuthPrinciple; - }; - // WIP: RC This should come from the store and populated using standard entity/non entity methods - userSummaries$: { - [endpointGuid: string]: { - [userGuid: string]: Observable; - }; - }; - - - // WIP: Async/Sync calls. Need to review once store stuff done - session: SessionData; - - constructor(private store: Store) { - this.endpoints$ = store.select(endpointEntitiesSelector); - this.sessionData$ = store.select(selectSessionData()); - } - - initialise() { - observableCombineLatest( - this.endpoints$.pipe(take(1)), - this.sessionData$, - ).subscribe(([endpoints, session]: [IRequestEntityTypeState, SessionData]) => { - this.session = session; - Object.values(endpoints).forEach(endpoint => { - if (endpoint.connectionStatus !== 'connected') { - // User hasn't connected to this endpoint - return; - } else if (this.isInitialized(endpoint.guid)) { - // We have already initialised for this endpoint + user - return; - } - this.initializeForEndpoint(endpoint.guid, session); - }); - }); - } - - /** - * is user allowed the certain action - */ - isAllowed(endpointGuid: string, resourceType: CFAuthResource, action: CFAuthAction, ...args: any[]): boolean { - if (!this.isInitialized(endpointGuid)) { - return false; - } - return this.principals[endpointGuid].isAllowed.apply(this.principals[endpointGuid], args); - } - - remove(endpointGuid) { - delete this.principals[endpointGuid]; - } - - /** - * convenience method to determine if the user has rights to execute the action against the resource - * in the organization or any of the organization's spaces - */ - isOrgOrSpaceActionableByResource(endpointGuid: string, orgGuid: string, spaceGuids: string[], action: CFAuthAction): boolean { - // Is the organization valid? - if (this.isAllowed(endpointGuid, CFAuthResource.organization, action, orgGuid)) { - return true; - } else { - // Is any of the organization's spaces valid? - for (const spaceGuid in spaceGuids) { - if (this.isAllowed(endpointGuid, CFAuthResource.space, action, spaceGuid, orgGuid)) { - return true; - } - } - return false; - } - } - - /** - * Is User Admin in endpoint - */ - isAdmin(endpointGuid: string): boolean { - if (!this.isInitialized(endpointGuid)) { - return false; - } - return this.principals[endpointGuid].isAdmin; - } - - private isInitialized(endpointGuid: string): boolean { - let initialised = !!this.principals[endpointGuid]; - - if (this.session.user && initialised) { - initialised = this.session.endpoints.cf[endpointGuid].user.guid === this.session.user.guid; - } - return !!initialised; - } - - private initializeForEndpoint(endpointGuid: string, sessionData: SessionData) { - this.principals[endpointGuid] = null; - const cfUserGuid = sessionData.endpoints.cf[endpointGuid].user.guid; - const isAdmin = sessionData.endpoints.cf[endpointGuid].user.admin; - - if (isAdmin) { - // WIP: RC Fetch user role data using the user summary endpoint - // User is an admin, therefore, we will use the more efficient userSummary request - } else { - // WIP: RC Fetch user role data using seperate org/space requests - // promises = promises.concat(_addOrganisationRolePromisesForUser(endpointGuid, userId)); - // promises = promises.concat(_addSpaceRolePromisesForUser(endpointGuid, userId)); - } - - observableCombineLatest( - this.sessionData$, - this.featureFlags$[endpointGuid], - this.userSummaries$[endpointGuid][cfUserGuid], - ).pipe(take(1)).subscribe(([session, featureFlags, userSummary]: [SessionData, CFFeatureFlags, CfAuthUserSummary]) => { - const mappedSummary: CfAuthUserSummaryMapped = { - organizations: { - audited: userSummary.audited_organizations, - billingManaged: userSummary.billing_managed_organizations, - managed: userSummary.managed_organizations, - // User is a user in all these orgs - all: userSummary.organizations - }, - spaces: { - audited: userSummary.audited_spaces, - managed: userSummary.managed_spaces, - // User is a developer in this spaces - all: userSummary.spaces - } - }; - this.principals[endpointGuid] = new CfAuthPrinciple(cfUserGuid, session, mappedSummary, featureFlags); - }); - } - -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.types.ts b/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.types.ts deleted file mode 100644 index 5338ff9d32..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/cf-auth.types.ts +++ /dev/null @@ -1,80 +0,0 @@ -export enum CFAuthResource { - space, - user, - space_quota_definition, - user_provided_service_instance, - managed_service_instance, - service_instance, - organization, - application, - domain, - route -} - -export enum CFAuthAction { - create, - update, - delete, - rename -} - -export enum CFFeatureFlagTypes { - user_org_creation = 'user_org_creation', - private_domain_creation = 'private_domain_creation', - app_bits_upload = 'app_bits_upload', - app_scaling = 'app_scaling', - route_creation = 'route_creation', - service_instance_creation = 'service_instance_creation', - diego_docker = 'diego_docker', - set_roles_by_username = 'set_roles_by_username', - unset_roles_by_username = 'unset_roles_by_username', - task_creation = 'task_creation', - env_var_visibility = 'env_var_visibility', - 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', -} - -export interface CFFeatureFlags { - [type: string]: boolean; -} - -export interface CfAuthUserSummary { - // Org User - organizations: string[]; - // Org Manager - managed_organizations: string[]; - // Org Billing Manager - billing_managed_organizations: string[]; - // Space Auditor - audited_organizations: string[]; - // Space Dev - spaces: string[]; - // Space Manager - managed_spaces: string[]; - // Space Autditor - audited_spaces: string[]; -} - -export interface CfAuthUserSummaryMapped { - organizations: { - audited: string[], - billingManaged: string[], - managed: string[], - // User is a user in all these orgs - all: string[] - }; - spaces: { - audited: string[], - managed: string[], - // User is a developer in this spaces - all: string[] - }; -} - -export interface CFAuthChecker { - create: (spaceGuid?: string, orgGuid?: string) => boolean; - update: (spaceGuid?: string, orgGuid?: string, isSpace?: boolean) => boolean; - delete: (spaceGuid?: string, orgGuid?: string) => boolean; - canHandle: (CFAuthResources) => boolean; -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/application-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/application-access.ts deleted file mode 100644 index 073fc5b114..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/application-access.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { CFAuthChecker, CFAuthResource } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerApplication extends CfAuthBaseAccess implements CFAuthChecker { - - /** - * - */ - constructor(private principal: CfAuthPrinciple) { - super(principal); - - } - - /** - * User can deploy apps if: - * 1. User is an admin - * 2. User is a space developer - * @param spaceGuid GUID of the space where the application resides - */ - create(spaceGuid: string): boolean { - - // Admin - if (super.baseCreate()) { - return true; - } - - // If user is developer in space app belongs to - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * User can manage apps if: - * 1. User is an admin - * 2. User is a space developer - * @param spaceGuid GUID of the space where the application resides - */ - update(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - // If user is developer in space app belongs to - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * User can delete apps if: - * 1. User is an admin - * 2. User is a space developer - * @param spaceGuid GUID of the space where the application resides - */ - delete(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - // If user is developer in space app belongs to - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * Specifies that this ACL checker can handle `application` permission - * @param resource - String representing the resource - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.application; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/base-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/base-access.ts deleted file mode 100644 index 3205471f75..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/base-access.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CfAuthPrinciple } from '../principal'; -export class CfAuthBaseAccess { - - constructor(private basePrincipal: CfAuthPrinciple) { } - - baseCreate() { - return this.basePrincipal.isAdmin; - } - - baseUpdate() { - return this.basePrincipal.isAdmin; - } - - baseDelete() { - return this.basePrincipal.isAdmin; - } - - protected doesContainGuid(array, guid): boolean { - return !!array.find((entity) => { - return entity.metadata.guid; - }); - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/organization-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/organization-access.ts deleted file mode 100644 index 50231cc678..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/organization-access.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { CFAuthChecker, CFAuthResource, CFFeatureFlagTypes } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerOrganization extends CfAuthBaseAccess implements CFAuthChecker { - - /** - * - */ - constructor(private principal: CfAuthPrinciple) { - super(principal); - } - - /** - * Users can create an organization if: - * 1. User is and admin - * 2. the `user_org_creation` feature flag is enabled - */ - create(orgGuid: string): boolean { - - // Admin - if (super.baseCreate()) { - return true; - } - - // If user is developer in space app belongs to - return this.principal.hasAccessTo(CFFeatureFlagTypes.user_org_creation); - } - - /** - * Users can update an organization if: - * 1. User is and admin - * 2. is Org Manager - */ - update(orgGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - // If user is manager of org - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid); - } - - /** - * @description Users can delete an organization if: - * 1. User is and admin - * 2. is Org Manager - */ - delete(orgGuid: string): boolean { - // Admin - if (super.baseDelete()) { - return true; - } - - // If user is manager of org - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid); - } - - /** - * Specifies that this ACL checker can handle `application` permission - * @param resource - String representing the resource - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.organization; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/route-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/route-access.ts deleted file mode 100644 index 22d4de8403..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/route-access.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CFAuthChecker, CFAuthResource, CFFeatureFlagTypes } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerRoute extends CfAuthBaseAccess implements CFAuthChecker { - - /** - * - */ - constructor(private principal: CfAuthPrinciple) { - super(principal); - - } - - /** - * User can create a route if: - * 1. User is admin - * 2. User is a space developer AND route_creation feature flag is turned on - */ - create(spaceGuid: string): boolean { - - // Admin - if (super.baseCreate()) { - return true; - } - - // If user is developer in space app belongs to - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid) && - this.principal.hasAccessTo(CFFeatureFlagTypes.route_creation); - } - - /** - * User can manage apps if: - * 1. User is an admin - * 2. User is a space developer - */ - update(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * User can delete apps if: - * 1. User is an admin - * 2. User is a space developer - */ - delete(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * Specifies that this ACL checker can handle `application` permission - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.route; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/service-instance-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/service-instance-access.ts deleted file mode 100644 index 842e6086ac..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/service-instance-access.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CFAuthChecker, CFAuthResource, CFFeatureFlagTypes } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerServiceInstance extends CfAuthBaseAccess implements CFAuthChecker { - - constructor(private principal: CfAuthPrinciple) { - super(principal); - } - - /** - * A User is can create a service if: - * 1. User is an admin - * 2. Is a space developer and the feature flag is enabled - */ - create(spaceGuid: string): boolean { - - // If user is developer in space the service instances will - // belong to and the service_instance_creation flag is set - // Admin - if (super.baseCreate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid) && - this.principal.hasAccessTo(CFFeatureFlagTypes.service_instance_creation); - } - - /** - * User can update a service instance if: - * 1. User is an admin - * 2. or a space developer - */ - update(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * User can delete a service instance if: - * 1. They are an admin - * 2. or they are a space developer - */ - delete(spaceGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.spaces.all, spaceGuid); - } - - /** - * Specifies that this ACL checker can handle `application` permission - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.managed_service_instance; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/space-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/space-access.ts deleted file mode 100644 index f1ceea8a6f..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/space-access.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CFAuthChecker, CFAuthResource } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerSpace extends CfAuthBaseAccess implements CFAuthChecker { - - constructor(private principal: CfAuthPrinciple) { - super(principal); - } - - /** - * User can create a space if: - * 1. User is an Admin - * 2. User is an Org Manager - */ - create(spaceGuid: string): boolean { - if (super.baseCreate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.organizations.managed, spaceGuid); - } - - /** - * User can update a space if: - * 1. User is an admin - * 2. User is org manager - * 3. user is space manager - */ - update(spaceGuid: string, orgGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid) || - super.doesContainGuid(this.principal.userSummary.spaces.managed, spaceGuid); - } - - /** - * User can delete space if: - * 1. user is an admin - * 2. user is the org manager - */ - delete(orgGuid: string): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid); - } - - /** - * Specifies that this ACL checker can handle `application` permission - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.space; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/users-assign-access.ts b/src/frontend/packages/core/src/shared/components/cf-auth/checkers/users-assign-access.ts deleted file mode 100644 index 306859b618..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/checkers/users-assign-access.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { CFAuthChecker, CFAuthResource } from '../cf-auth.types'; -import { CfAuthPrinciple } from '../principal'; -import { CfAuthBaseAccess } from './base-access'; - -export class CFAuthCheckerUser extends CfAuthBaseAccess implements CFAuthChecker { - - constructor(private principal: CfAuthPrinciple) { - super(principal); - } - - create(): boolean { - return false; - } - - /** - * User can update a space if: - * 1. User is an admin - * 2. User is org manager - * 3. user is space manager - */ - update(spaceGuid: string, orgGuid: string, isSpace: boolean): boolean { - // Admin - if (super.baseUpdate()) { - return true; - } - - if (isSpace) { - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid) || - super.doesContainGuid(this.principal.userSummary.spaces.managed, spaceGuid); - } else { - return super.doesContainGuid(this.principal.userSummary.organizations.managed, orgGuid); - } - } - - delete(): boolean { - return false; - } - - /** - * Specifies that this ACL checker can handle `application` permission - */ - canHandle(resource: CFAuthResource): boolean { - return resource === CFAuthResource.user; - } -} diff --git a/src/frontend/packages/core/src/shared/components/cf-auth/principal.ts b/src/frontend/packages/core/src/shared/components/cf-auth/principal.ts deleted file mode 100644 index e1b6e615ef..0000000000 --- a/src/frontend/packages/core/src/shared/components/cf-auth/principal.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { SessionData } from '../../../../../store/src/types/auth.types'; -import { - CFAuthAction, - CFAuthChecker, - CFAuthResource, - CfAuthUserSummaryMapped, - CFFeatureFlags, - CFFeatureFlagTypes, -} from './cf-auth.types'; -import { CFAuthCheckerApplication } from './checkers/application-access'; -import { CFAuthCheckerOrganization } from './checkers/organization-access'; -import { CFAuthCheckerRoute } from './checkers/route-access'; -import { CFAuthCheckerServiceInstance } from './checkers/service-instance-access'; -import { CFAuthCheckerSpace } from './checkers/space-access'; -import { CFAuthCheckerUser } from './checkers/users-assign-access'; - -export class CfAuthPrinciple { - - checkers: any[]; - - isAdmin: boolean; - isAdminReadOnly: boolean; - isGlobalAuditor: boolean; - - - constructor( - private endpointGuid: string, - private session: SessionData, - public userSummary: CfAuthUserSummaryMapped, - private featureFlags: CFFeatureFlags) { - this.isAdmin = session.endpoints.cf[endpointGuid].user.admin; - this.isAdminReadOnly = false; // WIP: RC Calculate according to scope - this.isGlobalAuditor = false; // WIP: RC Calculate according to scope - } - - /** - * Does user have access to operation based on feature flags - */ - hasAccessTo(operation: CFFeatureFlagTypes): boolean { - return this.isAdmin || this.featureFlags[operation]; - } - - /** - * Is user permitted to do the action. - */ - isAllowed(resourceType: CFAuthResource, action: CFAuthAction): boolean { - - let args = Array.prototype.slice.call(arguments); - if (args.length > 2) { - // pass the rest of the arguments into accessChecker action - args = args.splice(2); - } - - const accessChecker = this.getAccessChecker(resourceType); - return accessChecker[action].apply(accessChecker, args); - } - - /** - * Internal method to create checker list - */ - private _createAccessCheckerList(): CFAuthChecker[] { - - const checkers = []; - - checkers.push(new CFAuthCheckerApplication(this)); - checkers.push(new CFAuthCheckerOrganization(this)); - checkers.push(new CFAuthCheckerRoute(this)); - checkers.push(new CFAuthCheckerServiceInstance(this)); - checkers.push(new CFAuthCheckerSpace(this)); - checkers.push(new CFAuthCheckerUser(this)); - return checkers; - } - - /** - * Get Access checker for a given resource type - */ - private getAccessChecker(resourceType: CFAuthResource): CFAuthChecker { - - if (!this.checkers || this.checkers.length === 0) { - this.checkers = this._createAccessCheckerList(); - } - - return this.checkers.find((checker: any) => { - return checker.canHandle(resourceType); - }); - } - -} diff --git a/src/frontend/packages/core/src/shared/components/dialog-confirm/dialog-confirm.component.spec.ts b/src/frontend/packages/core/src/shared/components/dialog-confirm/dialog-confirm.component.spec.ts index 34186fa3b8..64c2904cc1 100644 --- a/src/frontend/packages/core/src/shared/components/dialog-confirm/dialog-confirm.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/dialog-confirm/dialog-confirm.component.spec.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RequestInfoState } from '../../../../../store/src/reducers/api-request-reducer/types'; diff --git a/src/frontend/packages/core/src/shared/components/extension-buttons/extension-buttons.component.ts b/src/frontend/packages/core/src/shared/components/extension-buttons/extension-buttons.component.ts index e1c0826400..d16ebf598a 100644 --- a/src/frontend/packages/core/src/shared/components/extension-buttons/extension-buttons.component.ts +++ b/src/frontend/packages/core/src/shared/components/extension-buttons/extension-buttons.component.ts @@ -2,7 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Store } from '@ngrx/store'; import { of } from 'rxjs'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../../../store/src/app-state'; import { getActionsFromExtensions, StratosActionMetadata, @@ -21,7 +21,7 @@ export class ExtensionButtonsComponent implements OnInit { @Input() type: StratosActionType; constructor( - private store: Store + private store: Store ) { } ngOnInit() { diff --git a/src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.ts b/src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.ts index 1559f873f6..ffd96652f0 100644 --- a/src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.ts +++ b/src/frontend/packages/core/src/shared/components/favorites-global-list/favorites-global-list.component.ts @@ -3,7 +3,7 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../../../store/src/app-state'; import { getFavoriteInfoObservable } from '../../../../../store/src/helpers/store-helpers'; import { IFavoriteEntity, @@ -22,7 +22,7 @@ export class FavoritesGlobalListComponent implements OnInit { public favInfo$: Observable; public favoriteGroups$: Observable; constructor( - private store: Store, + private store: Store, private userFavoriteManager: UserFavoriteManager ) { } diff --git a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts index 0e39935fd9..94e4d2bbd6 100644 --- a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts +++ b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts @@ -1,19 +1,21 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, +} from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; +import { IEntityMetadata, IStratosEntityDefinition } from '../../../../../store/src/entity-catalog/entity-catalog.types'; +import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { EntityRequestAction } from '../../../../../store/src/types/request.types'; import { IFavoriteMetadata, IFavoriteTypeInfo, UserFavorite, UserFavoriteEndpoint, } from '../../../../../store/src/types/user-favorites.types'; -import { StratosBaseCatalogEntity } from '../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata, IStratosEntityDefinition } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { MetaCardMenuItem } from '../list/list-cards/meta-card/meta-card-base/meta-card.component'; -import { EntityRequestAction } from '../../../../../store/src/types/request.types'; -import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; export interface IFavoriteTypes { diff --git a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts index 7476f5156f..e95dea1c1a 100644 --- a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts @@ -3,10 +3,11 @@ import { Store } from '@ngrx/store'; import { isObservable, Observable, of as observableOf } from 'rxjs'; import { map } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { RemoveUserFavoriteAction, } from '../../../../../store/src/actions/user-favourites-actions/remove-user-favorite-action'; +import { AppState } from '../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; import { IFavoriteMetadata, UserFavorite } from '../../../../../store/src/types/user-favorites.types'; import { userFavoritesEntitySchema } from '../../../base-entity-schemas'; @@ -16,7 +17,6 @@ import { ComponentEntityMonitorConfig, StratosStatus } from '../../shared.types' import { ConfirmationDialogConfig } from '../confirmation-dialog.config'; import { ConfirmationDialogService } from '../confirmation-dialog.service'; import { MetaCardMenuItem } from '../list/list-cards/meta-card/meta-card-base/meta-card.component'; -import { entityCatalog } from './../../../../../store/src/entity-catalog/entity-catalog.service'; import { IFavoritesMetaCardConfig } from './favorite-config-mapper'; @@ -113,7 +113,7 @@ export class FavoritesMetaCardComponent { } constructor( - private store: Store, + private store: Store, private confirmDialog: ConfirmationDialogService ) { } diff --git a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts index 762a4df7c4..b1fdfc75c7 100644 --- a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts @@ -29,7 +29,7 @@ import { ListFilter, ListSort } from '../../../../../../store/src/actions/list.a import { MetricsAction } from '../../../../../../store/src/actions/metrics.actions'; import { IgnorePaginationMaxedState, SetResultCount } from '../../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { PaginationMonitor } from '../../../../../../store/src/monitors/pagination-monitor'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; diff --git a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts index 663ef63e5e..c84c1c7402 100644 --- a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts +++ b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationEntityState } from '../../../../../../store/src/types/pagination.types'; export class LocalPaginationHelpers { diff --git a/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.spec.ts index 7de7f3464a..93b850ca5e 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.spec.ts @@ -2,15 +2,15 @@ import { Component, ViewChild } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserAnimationsModule, NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule } from '@ngrx/store'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { Observable, of } from 'rxjs'; import { EntitySchema } from '../../../../../../../../store/src/helpers/entity-schema'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { IFavoriteMetadata, UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; import { CoreTestingModule } from '../../../../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import * as favoriteHelpers from '../../../../../../core/user-favorite-helpers'; import { UserFavoriteManager } from '../../../../../../core/user-favorite-manager'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { SharedModule } from '../../../../../shared.module'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../shared.types'; import { FavoritesConfigMapper } from '../../../../favorites-meta-card/favorite-config-mapper'; @@ -152,7 +152,7 @@ describe('MetaCardComponent', () => { it('should set favorite from entityConfig if not set', () => { spyOn(favoritesConfigMapper, 'getPrettyTypeName').and.returnValue('prettyName'); - spyOn(favoriteHelpers, 'getFavoriteFromCfEntity').and.returnValue(favorite); + spyOn(favoriteHelpers, 'getFavoriteFromEntity').and.returnValue(favorite); component.entityConfig = entityConfig; fixture.detectChanges(); diff --git a/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.ts b/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.ts index 34ac89593b..868d8477d4 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component.ts @@ -2,10 +2,10 @@ import { Component, ContentChild, ContentChildren, Input, OnDestroy, QueryList } import { combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { IFavoriteMetadata, UserFavorite } from '../../../../../../../../store/src/types/user-favorites.types'; -import { getFavoriteFromCfEntity } from '../../../../../../core/user-favorite-helpers'; +import { getFavoriteFromEntity } from '../../../../../../core/user-favorite-helpers'; import { safeUnsubscribe } from '../../../../../../core/utils.service'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { ComponentEntityMonitorConfig, StratosStatus } from '../../../../../shared.types'; import { FavoritesConfigMapper } from '../../../../favorites-meta-card/favorite-config-mapper'; import { MetaCardItemComponent } from '../meta-card-item/meta-card-item.component'; @@ -77,7 +77,12 @@ export class MetaCardComponent implements OnDestroy { if (!this.favorite) { this.entityMonitorSub = entityMonitor.entity$.pipe( first(), - tap(entity => this.favorite = getFavoriteFromCfEntity(entity, entityConfig.schema.key, this.favoritesConfigMapper)) + tap(entity => this.favorite = getFavoriteFromEntity( + entity, + entityConfig.schema.key, + this.favoritesConfigMapper, + entityConfig.schema.endpointType + )) ).subscribe(); } } diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.ts b/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.ts index 883f11b3fe..979c260eb6 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/app-table-cell-default/app-table-cell-default.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnDestroy } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { Subscription, Observable } from 'rxjs'; import { objectHelper } from '../../../../../core/helper-classes/object.helpers'; import { pathGet } from '../../../../../core/utils.service'; @@ -7,7 +7,6 @@ import { TableCellCustom } from '../../list.types'; import { ICellDefinition } from '../table.types'; @Component({ - moduleId: module.id, selector: 'app-table-cell-default', templateUrl: 'app-table-cell-default.component.html', styleUrls: ['app-table-cell-default.component.scss'] @@ -43,7 +42,7 @@ export class TableCellDefaultComponent extends TableCellCustom implements public isExternalLink = false; public linkValue: string; public linkTarget = '_self'; - public valueGenerator: (row: T, schemaKey?: string) => string; + public valueGenerator: (row: T, schemaKey?: string) => string | Observable; public showShortLink = false; public init() { diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-actions/table-cell-actions.component.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-actions/table-cell-actions.component.ts index 189d183027..858dba6ce4 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-actions/table-cell-actions.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-actions/table-cell-actions.component.ts @@ -3,7 +3,7 @@ import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest, Observable, of as observableOf } from 'rxjs'; import { map } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../../../../../store/src/app-state'; import { RowState } from '../../data-sources-controllers/list-data-source-types'; import { IListAction, ListConfig } from '../../list.component.types'; import { TableCellCustom } from '../../list.types'; @@ -40,7 +40,7 @@ export class TableCellActionsComponent extends TableCellCustom implements private subjects: BehaviorSubject[] = []; - constructor(private store: Store, public listConfig: ListConfig) { + constructor(private store: Store, public listConfig: ListConfig) { super(); this.actions = listConfig.getSingleActions(); } diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component.spec.ts index 63ec9866f1..60a884ed59 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component.spec.ts @@ -1,8 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { ApplicationServiceMock } from '../../../../../../test-framework/application-service-helper'; import { CoreModule } from '../../../../../core/core.module'; import { IListDataSource } from '../../data-sources-controllers/list-data-source-types'; import { TableCellRadioComponent } from './table-cell-radio.component'; @@ -16,9 +14,7 @@ describe('TableCellRadioComponent', () => { TestBed.configureTestingModule({ declarations: [TableCellRadioComponent], imports: [CoreModule], - providers: [ - { provide: ApplicationService, useClass: ApplicationServiceMock } - ] + providers: [] }).compileComponents(); }) ); diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component.ts index db2cb2883e..6bb2311dfb 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component.ts @@ -1,7 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; -import { schema } from 'normalizr'; +import { getRowMetadata } from '@stratos/store'; -import { getRowMetadata } from '../../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; import { EntitySchema } from '../../../../../../../store/src/helpers/entity-schema'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { AppMonitorComponentTypes } from '../../../app-action-monitor-icon/app-action-monitor-icon.component'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-status.directive.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-status.directive.ts index 1cdbabb6d8..d5e2509f1b 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-status.directive.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell-status.directive.ts @@ -1,4 +1,4 @@ -import { Directive, ElementRef, Input, OnChanges, SimpleChanges, Renderer, Renderer2 } from '@angular/core'; +import { Directive, ElementRef, Input, OnChanges, SimpleChanges, Renderer2 } from '@angular/core'; @Directive({ selector: '[appTableCellStatus]' diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.spec.ts index e630f5f39d..b7ff749166 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.spec.ts @@ -1,24 +1,5 @@ -/* tslint:disable:max-line-length */ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { - CfOrgSpaceLinksComponent, -} from '../../../../../../../cloud-foundry/src/shared/components/cf-org-space-links/cf-org-space-links.component'; -import { - CfRoleCheckboxComponent, -} from '../../../../../../../cloud-foundry/src/shared/components/cf-role-checkbox/cf-role-checkbox.component'; -import { - EventTabActorIconPipe, -} from '../../../../../../../cloud-foundry/src/shared/components/list/list-types/cf-events/table-cell-event-action/event-tab-actor-icon.pipe'; -import { - RunningInstancesComponent, -} from '../../../../../../../cloud-foundry/src/shared/components/running-instances/running-instances.component'; -import { - ServicePlanPriceComponent, -} from '../../../../../../../cloud-foundry/src/shared/components/service-plan-price/service-plan-price.component'; -import { - ServicePlanPublicComponent, -} from '../../../../../../../cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component'; import { CoreModule } from '../../../../../core/core.module'; import { UtilsService } from '../../../../../core/utils.service'; import { PercentagePipe } from '../../../../pipes/percentage.pipe'; @@ -29,14 +10,12 @@ import { } from '../../../application-state/application-state-icon/application-state-icon.component'; import { ApplicationStateIconPipe } from '../../../application-state/application-state-icon/application-state-icon.pipe'; import { ApplicationStateComponent } from '../../../application-state/application-state.component'; -import { ApplicationStateService } from '../../../application-state/application-state.service'; import { BooleanIndicatorComponent } from '../../../boolean-indicator/boolean-indicator.component'; import { AppChipsComponent } from '../../../chips/chips.component'; -import { GithubCommitAuthorComponent } from '../../../github-commit-author/github-commit-author.component'; -import { ServiceInstanceLastOpComponent } from '../../../service-instance-last-op/service-instance-last-op.component'; import { UsageGaugeComponent } from '../../../usage-gauge/usage-gauge.component'; import { listTableCells, TableCellComponent } from './table-cell.component'; +/* tslint:disable:max-line-length */ /* tslint:enable:max-line-length */ @@ -50,28 +29,27 @@ describe('TableCellComponent', () => { AppActionMonitorIconComponent, TableCellComponent, ...listTableCells, - EventTabActorIconPipe, + // EventTabActorIconPipe, ValuesPipe, ApplicationStateComponent, ApplicationStateIconComponent, ApplicationStateIconPipe, UsageGaugeComponent, PercentagePipe, - RunningInstancesComponent, + // RunningInstancesComponent, AppChipsComponent, BooleanIndicatorComponent, - CfRoleCheckboxComponent, - GithubCommitAuthorComponent, - ServicePlanPriceComponent, - ServicePlanPublicComponent, - CfOrgSpaceLinksComponent, - ServiceInstanceLastOpComponent + // CfRoleCheckboxComponent, + // GithubCommitAuthorComponent, + // ServicePlanPriceComponent, + // ServicePlanPublicComponent, + // CfOrgSpaceLinksComponent, + // ServiceInstanceLastOpComponent ], imports: [ CoreModule ], providers: [ - ApplicationStateService, UtilsService, ] }) diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.ts b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.ts index 62ef19ec1a..beb3046000 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table-cell/table-cell.component.ts @@ -21,9 +21,6 @@ import { import { TableCellEndpointStatusComponent, } from '../../list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component'; -import { - TableCellCommitAuthorComponent, -} from '../../list-types/github-commits/table-cell-commit-author/table-cell-commit-author.component'; import { TableCellCustom } from '../../list.types'; import { TableCellDefaultComponent } from '../app-table-cell-default/app-table-cell-default.component'; import { TableCellActionsComponent } from '../table-cell-actions/table-cell-actions.component'; @@ -52,7 +49,6 @@ export const listTableCells: Type>[] = [ TableCellEndpointNameComponent, TableCellBooleanIndicatorComponent, TableCellRadioComponent, - TableCellCommitAuthorComponent, TableCellRequestMonitorIconComponent, TableCellFavoriteComponent, TableCellEndpointDetailsComponent, diff --git a/src/frontend/packages/core/src/shared/components/list/list-table/table.component.scss b/src/frontend/packages/core/src/shared/components/list/list-table/table.component.scss index a6c0e9a071..8c2db26e14 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-table/table.component.scss +++ b/src/frontend/packages/core/src/shared/components/list/list-table/table.component.scss @@ -87,6 +87,12 @@ mat-header-cell { word-break: break-all; } } + + &--table-column-additional-padding { + app-table-cell { + padding-left: 15px; + } + } } &__row { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts deleted file mode 100644 index 9f35194807..0000000000 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { filter, first, map, switchMap } from 'rxjs/operators'; - -import { - serviceBrokerEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../../cloud-foundry/src/cf-types'; -import { - getCfService, - getServiceName, -} from '../../../../../../../../cloud-foundry/src/features/service-catalog/services-helper'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; -import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { IServiceBroker, IServiceInstance } from '../../../../../../core/cf-api-svc.types'; -import { TableCellCustom } from '../../../list.types'; - -// TODO: Move CF code to CF Module #3769 - -@Component({ - selector: 'app-table-cell-service', - templateUrl: './table-cell-service.component.html', - styleUrls: ['./table-cell-service.component.scss'] -}) -export class TableCellServiceComponent extends TableCellCustom> implements OnInit { - - serviceName$: Observable; - serviceUrl$: Observable; - serviceBrokerName$: Observable; - // tslint:disable-next-line:ban-types - isUserProvidedServiceInstance: Boolean; - - @Input() row: APIResource; - @Input() entityKey: string; - - constructor(private entityServiceFactory: EntityServiceFactory) { - super(); - } - - ngOnInit() { - this.isUserProvidedServiceInstance = - this.entityKey === entityCatalog.getEntityKey(CF_ENDPOINT_TYPE, userProvidedServiceInstanceEntityType); - - const service$ = getCfService(this.row.entity.service_guid, this.row.entity.cfGuid, this.entityServiceFactory).waitForEntity$.pipe( - filter(s => !!s), - ); - - this.serviceName$ = service$.pipe( - map(s => this.isUserProvidedServiceInstance ? 'User Provided' : getServiceName(s.entity)) - ); - - this.serviceUrl$ = service$.pipe( - map(service => `/marketplace/${service.entity.entity.cfGuid}/${service.entity.metadata.guid}/summary`) - ); - - this.serviceBrokerName$ = service$.pipe( - first(), - switchMap(service => { - const brokerGuid = service.entity.entity.service_broker_guid; - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceBrokersAction = actionBuilder(brokerGuid, service.entity.entity.cfGuid); - return this.entityServiceFactory.create>( - brokerGuid, - getServiceBrokersAction - ).waitForEntity$.pipe( - map(a => a.entity), - filter(res => !!res), - map(a => a.entity.name), - first() - ); - }) - ); - - } - -} diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts index e8a189b97a..22843439b7 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts @@ -15,8 +15,10 @@ import { AppState } from 'frontend/packages/store/src/app-state'; import { Observable, of, ReplaySubject, Subscription } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { StratosCatalogEndpointEntity } from '../../../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosCatalogEndpointEntity, +} from '../../../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { UserFavoriteEndpoint } from '../../../../../../../../store/src/types/user-favorites.types'; import { safeUnsubscribe } from '../../../../../../core/utils.service'; @@ -62,12 +64,12 @@ export class EndpointCardComponent extends CardCell implements On @Input() component: EndpointListDetailsComponent; private endpointDetails: ViewContainerRef; - @ViewChild('endpointDetails', { read: ViewContainerRef, static: false }) set content(content: ViewContainerRef) { + @ViewChild('endpointDetails', { read: ViewContainerRef }) set content(content: ViewContainerRef) { this.endpointDetails = content; this.updateInnerComponent(); } - @ViewChild('copyToClipboard', { static: false }) copyToClipboard: CopyToClipboardComponent; + @ViewChild('copyToClipboard') copyToClipboard: CopyToClipboardComponent; private pRow: EndpointModel; @Input('row') diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts index a90bb816ad..d785fb066b 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts @@ -4,18 +4,18 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { map, pairwise } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { DisconnectEndpoint, UnregisterEndpoint } from '../../../../../../../store/src/actions/endpoint.actions'; import { ShowSnackBar } from '../../../../../../../store/src/actions/snackBar.actions'; import { GetSystemInfo } from '../../../../../../../store/src/actions/system.actions'; +import { AppState } from '../../../../../../../store/src/app-state'; import { EndpointsEffect } from '../../../../../../../store/src/effects/endpoint.effects'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { selectDeletionInfo, selectUpdateInfo } from '../../../../../../../store/src/selectors/api.selectors'; import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; import { STRATOS_ENDPOINT_TYPE } from '../../../../../base-entity-schemas'; import { CurrentUserPermissions } from '../../../../../core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { LoggerService } from '../../../../../core/logger.service'; import { ConnectEndpointDialogComponent, @@ -44,7 +44,7 @@ function isEndpointListDetailsComponent(obj: any): EndpointListDetailsComponent export class EndpointListHelper { private endpointEntityKey = entityCatalog.getEntityKey(STRATOS_ENDPOINT_TYPE, endpointSchemaKey); constructor( - private store: Store, + private store: Store, private dialog: MatDialog, private currentUserPermissionsService: CurrentUserPermissionsService, private confirmDialog: ConfirmationDialogService, @@ -98,7 +98,7 @@ export class EndpointListHelper { description: '', createVisible: (row$: Observable) => row$.pipe(map(row => { const endpoint = entityCatalog.getEndpoint(row.cnsi_type, row.sub_type); - const ep = endpoint ? endpoint.definition : {unConnectable: false}; + const ep = endpoint ? endpoint.definition : { unConnectable: false }; return !ep.unConnectable && row.connectionStatus === 'disconnected'; })) }, diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-data-source.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-data-source.ts index af213cc031..1f2999e41b 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-data-source.ts @@ -1,20 +1,20 @@ import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { GetAllEndpoints } from '../../../../../../../store/src/actions/endpoint.actions'; -import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; +import { AppState } from '../../../../../../../store/src/app-state'; import { EntityMonitorFactory } from '../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../../../../../store/src/monitors/internal-event-monitor.factory'; import { PaginationMonitorFactory } from '../../../../../../../store/src/monitors/pagination-monitor.factory'; +import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; import { IListConfig } from '../../list.component.types'; import { BaseEndpointsDataSource } from './base-endpoints-data-source'; export class EndpointsDataSource extends BaseEndpointsDataSource { - store: Store; + store: Store; constructor( - store: Store, + store: Store, listConfig: IListConfig, paginationMonitorFactory: PaginationMonitorFactory, entityMonitorFactory: EntityMonitorFactory, diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts index 8483e01383..fd8d8c57fc 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts @@ -2,9 +2,9 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { filter } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { AppState } from '../../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityMonitorFactory } from '../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../../../../../store/src/monitors/internal-event-monitor.factory'; import { PaginationMonitorFactory } from '../../../../../../../store/src/monitors/pagination-monitor.factory'; @@ -100,7 +100,7 @@ export class EndpointsListConfigService implements IListConfig { enableTextFilter = true; constructor( - private store: Store, + private store: Store, paginationMonitorFactory: PaginationMonitorFactory, entityMonitorFactory: EntityMonitorFactory, internalEventMonitorFactory: InternalEventMonitorFactory, diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts index e402966099..33ce1723a0 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts @@ -9,8 +9,8 @@ import { ViewContainerRef, } from '@angular/core'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { TableCellCustom } from '../../../list.types'; import { EndpointListDetailsComponent, EndpointListHelper } from '../endpoint-list.helpers'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.spec.ts index 384f6ad9d5..02c3cb866a 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.spec.ts @@ -1,9 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CFBaseTestModules } from '../../../../../../../../cloud-foundry/test-framework/cf-test-helper'; +import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; +import { BaseTestModules } from '../../../../../../../test-framework/core-test.helper'; import { CoreModule } from '../../../../../../core/core.module'; -import { EntityMonitorFactory } from '../../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { TableCellEndpointNameComponent } from './table-cell-endpoint-name.component'; describe('TableCellEndpointNameComponent', () => { @@ -14,9 +14,7 @@ describe('TableCellEndpointNameComponent', () => { TestBed.configureTestingModule({ imports: [ CoreModule, - // CoreTestingModule, - // createBasicStoreModule(), - ...CFBaseTestModules + ...BaseTestModules, ], providers: [ EntityMonitorFactory, diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts index fb694f04f3..62928cef55 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts @@ -3,11 +3,11 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/internal/operators/map'; import { GetAllEndpoints } from '../../../../../../../../store/src/actions/endpoint.actions'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { EndpointsService } from '../../../../../../core/endpoints.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { TableCellCustom } from '../../../list.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; export interface RowWithEndpointId { endpointId: string; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts index 148bb9a7de..7d1d870f70 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts @@ -1,8 +1,8 @@ import { Component, Input, OnInit } from '@angular/core'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../list.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; @Component({ selector: 'app-table-cell-endpoint-status', diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.scss b/src/frontend/packages/core/src/shared/components/list/list.component.scss index 2756aa86c1..1e2bd8a3b6 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.scss +++ b/src/frontend/packages/core/src/shared/components/list/list.component.scss @@ -17,6 +17,10 @@ } } + .list-component__header-card { + padding-left: 20px; + } + &__cards { .list-component__header-card { margin-bottom: 20px; @@ -81,14 +85,6 @@ padding: 10px 10px 10px 0; } - &--metrics-range { - padding-left: 10px; - - app-metrics-range-selector { - padding-left: 10px; - } - } - &--multi-actions { button { &:first-of-type { diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/list.component.spec.ts index 98ae59bcc2..6a7ce0ac11 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/list.component.spec.ts @@ -2,20 +2,19 @@ import { ChangeDetectorRef, NgZone } from '@angular/core'; import { async, ComponentFixture, inject, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { Store } from '@ngrx/store'; +import { createBasicStoreModule } from '@stratos/store/testing'; import { BehaviorSubject, of as observableOf } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { ListView } from '../../../../../store/src/actions/list.actions'; import { GeneralAppState } from '../../../../../store/src/app-state'; +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'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; -import { createBasicStoreModule } from '@stratos/store/testing'; import { CoreModule } from '../../../core/core.module'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { SharedModule } from '../../shared.module'; -import { ApplicationStateService } from '../application-state/application-state.service'; import { EndpointCardComponent } from './list-types/endpoint/endpoint-card/endpoint-card.component'; import { EndpointListHelper } from './list-types/endpoint/endpoint-list.helpers'; import { EndpointsListConfigService } from './list-types/endpoint/endpoints-list-config.service'; @@ -123,7 +122,7 @@ describe('ListComponent', () => { TestBed.configureTestingModule({ providers: [ { provide: ListConfig, useClass: EndpointsListConfigService }, - ApplicationStateService, + // ApplicationStateService, PaginationMonitorFactory, EntityMonitorFactory, EndpointListHelper diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.ts b/src/frontend/packages/core/src/shared/components/list/list.component.ts index 557bf779ab..318bd0dd7e 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list.component.ts @@ -51,7 +51,7 @@ import { } from '../../../../../store/src/actions/list.actions'; import { SetClientFilterKey, SetPage } from '../../../../../store/src/actions/pagination.actions'; import { GeneralAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { ActionState } from '../../../../../store/src/reducers/api-request-reducer/types'; import { getListStateObservables } from '../../../../../store/src/reducers/list.reducer'; @@ -116,7 +116,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView pPaginator: MatPaginator; private filterString: string; - @ViewChild(MatPaginator, { static: false }) set setPaginator(paginator: MatPaginator) { + @ViewChild(MatPaginator) set setPaginator(paginator: MatPaginator) { if (!paginator || this.paginationWidgetToStore) { return; } @@ -143,7 +143,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView }); } - @ViewChild('filter', { static: false }) set setFilter(filterValue: NgModel) { + @ViewChild('filter') set setFilter(filterValue: NgModel) { if (!filterValue || this.filterWidgetToStore) { return; } @@ -230,7 +230,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView private store: Store, private cd: ChangeDetectorRef, @Optional() public config: ListConfig, - private ngZone: NgZone + private ngZone: NgZone, ) { } ngOnInit() { @@ -690,8 +690,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView return observableOf(getDefaultRowState()); } const catalogEntity = entityCatalog.getEntity(entityConfig); - const entityMonitor = catalogEntity.getEntityMonitor( - this.store, + const entityMonitor = catalogEntity.store.getEntityMonitor( dataSource.getRowUniqueId(row), { schemaKey: entityConfig.schemaKey diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.types.ts b/src/frontend/packages/core/src/shared/components/list/list.component.types.ts index a8321b6fc5..ae2038162f 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.types.ts +++ b/src/frontend/packages/core/src/shared/components/list/list.component.types.ts @@ -13,6 +13,7 @@ import { ListDataSource } from './data-sources-controllers/list-data-source'; import { IListDataSource } from './data-sources-controllers/list-data-source-types'; import { CardTypes } from './list-cards/card/card.component'; import { ITableColumn, ITableText } from './list-table/table.types'; +import { Injectable } from "@angular/core"; import { CardCell } from './list.types'; export enum ListViewTypes { @@ -151,6 +152,7 @@ export interface IListMultiFilterConfigItem { export const defaultPaginationPageSizeOptionsCards = [defaultClientPaginationPageSize, 30, 80]; export const defaultPaginationPageSizeOptionsTable = [defaultClientPaginationPageSize, 20, 80]; +@Injectable() export class ListConfig implements IListConfig { isLocal = false; pageSizeOptions = defaultPaginationPageSizeOptionsCards; diff --git a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.spec.ts index abb3e9ef77..7a1fe8fb5e 100644 --- a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.spec.ts @@ -1,5 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatIconModule } from '@angular/material'; +import { MatIconModule } from '@angular/material/icon'; import { RouterTestingModule } from '@angular/router/testing'; import { createBasicStoreModule } from '../../../../../../store/testing/public-api'; diff --git a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts index 1e82d3bd24..36294cb32f 100644 --- a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { PaginationPageIteratorConfig, diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts index ad051defa2..0b75bc20e1 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts @@ -1,10 +1,13 @@ -import { ListDataSource } from '../data-sources-controllers/list-data-source'; import { Store } from '@ngrx/store'; -import { StratosBaseCatalogEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { ListConfig, ListViewTypes } from '../list.component.types'; -import { createTableColumnFavorite } from '../list-table/table-cell-favorite/table-cell-favorite.component'; + +import { + StratosBaseCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityPipelineEntity } from '../../../../../../store/src/entity-request-pipeline/pipeline.types'; import { UserFavorite } from '../../../../../../store/src/types/user-favorites.types'; -import { EntityPipelineEntity, } from '../../../../../../store/src/entity-request-pipeline/pipeline.types'; +import { ListDataSource } from '../data-sources-controllers/list-data-source'; +import { createTableColumnFavorite } from '../list-table/table-cell-favorite/table-cell-favorite.component'; +import { ListConfig, ListViewTypes } from '../list.component.types'; export interface GetMultipleActionConfig { endpointGuid?: string; diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts index 94b7067d6c..a3edaef193 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts @@ -1,15 +1,18 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { RouterTestingModule } from '@angular/router/testing'; -import { SimpleListComponent } from './simple-list.component'; -import { SharedModule } from '../../../shared.module'; -import { CoreModule } from '../../../../core/core.module'; -import { AppReducersModule } from '../../../../../../store/src/reducers.module'; -import { StratosCatalogEntity, StratosCatalogEndpointEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; +import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from '../../../../../../store/src/entity-catalog-test.module'; +import { + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { StratosEndpointExtensionDefinition } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; -import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from '../../../../../../store/src/entity-catalog-test.module'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; +import { AppReducersModule } from '../../../../../../store/src/reducers.module'; +import { CoreModule } from '../../../../core/core.module'; +import { SharedModule } from '../../../shared.module'; +import { SimpleListComponent } from './simple-list.component'; describe('SimpleListComponent', () => { let component: SimpleListComponent; diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts index 64568a8aea..b5377d1ee4 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts @@ -1,11 +1,14 @@ -import { Component, OnInit, Input, ChangeDetectorRef, NgZone, ComponentFactoryResolver, ViewChild, Injector } from '@angular/core'; -import { StratosCatalogEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; +import { Component, ComponentFactoryResolver, Injector, Input, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; + +import { + StratosCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ListComponent } from '../list.component'; -import { ListConfig, ListViewTypes } from '../list.component.types'; -import { ListHostDirective } from './list-host.directive'; +import { ListConfig } from '../list.component.types'; import { CatalogEntityDrivenListDataSource } from './entity-catalog-datasource'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute } from '@angular/router'; +import { ListHostDirective } from './list-host.directive'; @Component({ selector: 'app-simple-list', diff --git a/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.spec.ts b/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.spec.ts index 98fa58a275..09af467030 100644 --- a/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.spec.ts @@ -2,8 +2,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { createBasicStoreModule } from '@stratos/store/testing'; -import { FetchApplicationMetricsAction } from '../../../../../cloud-foundry/src/actions/cf-metrics.actions'; -import { MetricQueryConfig } from '../../../../../store/src/actions/metrics.actions'; import { CoreTestingModule } from '../../../../test-framework/core-test.modules'; import { CoreModule } from '../../../core/core.module'; import { MDAppModule } from '../../../core/md.module'; @@ -35,14 +33,15 @@ xdescribe('MetricsChartComponent', () => { component = fixture.componentInstance; component.chartConfig = new MetricsLineChartConfig(); component.chartConfig.xAxisLabel = 'Time'; - component.metricsConfig = { - metricsAction: new FetchApplicationMetricsAction( - '1', - '2', - new MetricQueryConfig('test'), - ), - getSeriesName: () => 'test' - }; + // TODO: Don't use action in another package + // component.metricsConfig = { + // metricsAction: new FetchApplicationMetricsAction( + // '1', + // '2', + // new MetricQueryConfig('test'), + // ), + // getSeriesName: () => 'test' + // }; fixture.detectChanges(); }); diff --git a/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.ts b/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.ts index dfa08eac16..87c950e6ae 100644 --- a/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.ts +++ b/src/frontend/packages/core/src/shared/components/metrics-chart/metrics-chart.component.ts @@ -3,17 +3,17 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, Subscription, timer } from 'rxjs'; import { debounce, distinctUntilChanged, map, startWith } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { MetricsAction } from '../../../../../store/src/actions/metrics.actions'; +import { AppState } from '../../../../../store/src/app-state'; +import { EntityMonitor } from '../../../../../store/src/monitors/entity-monitor'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { ChartSeries, IMetrics, MetricResultTypes, MetricsFilterSeries, } from '../../../../../store/src/types/base-metric.types'; -import { EntityMonitor } from '../../../../../store/src/monitors/entity-monitor'; import { MetricsRangeSelectorComponent } from '../metrics-range-selector/metrics-range-selector.component'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { MetricsChartTypes, MetricsLineChartConfig, YAxisTickFormattingFunc } from './metrics-chart.types'; import { MetricsChartManager } from './metrics.component.manager'; @@ -66,7 +66,7 @@ export class MetricsChartComponent implements OnInit, OnDestroy, AfterContentIni public isFetching$: Observable; constructor( - private store: Store, + private store: Store, private entityMonitorFactory: EntityMonitorFactory ) { } private sort(metricsArray: ChartSeries[]) { diff --git a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.scss b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.scss index 9175080272..0bcddcdc56 100644 --- a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.scss +++ b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.scss @@ -6,7 +6,6 @@ display: flex; &__overlay { - background-color: rgba(0, 0, 0, 0); left: 0; overflow: hidden; position: absolute; @@ -29,7 +28,6 @@ } &-show { - background-color: rgba(0, 0, 0, .6); transition-delay: 0s; visibility: visible; @@ -39,7 +37,6 @@ } &-inner { - box-shadow: -4px 3px 41px -1px rgba(0, 0, 0, .36); padding: 50px; position: relative; transform: translateY(-100%); diff --git a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.theme.scss b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.theme.scss index bc0be4568d..47911410fe 100644 --- a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.theme.scss +++ b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.theme.scss @@ -1,10 +1,18 @@ @import '~@angular/material/theming'; @mixin metrics-range-selector-theme($theme, $app-theme) { $primary: map-get($theme, primary); + $background-color: map-get($app-theme, app-background-color); + $foreground: map-get($theme, foreground); + .metrics-range-selector { &__overlay { + background-color: $background-color; + &-show { + background-color: rgba($background-color, .6); + } &-inner { - background-color: mat-contrast($primary, 500); + background-color: $background-color; + box-shadow: -4px 3px 41px -1px rgba(0, 0, 0, .36); } } } diff --git a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.ts b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.ts index 5cd0b3e7c5..d485087726 100644 --- a/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.ts +++ b/src/frontend/packages/core/src/shared/components/metrics-range-selector/metrics-range-selector.component.ts @@ -2,11 +2,10 @@ import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core import * as moment from 'moment'; import { Subscription } from 'rxjs'; -import { metricEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { MetricsAction } from '../../../../../store/src/actions/metrics.actions'; -import { IMetrics } from '../../../../../store/src/types/base-metric.types'; import { EntityMonitor } from '../../../../../store/src/monitors/entity-monitor'; import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; +import { IMetrics } from '../../../../../store/src/types/base-metric.types'; import { MetricsRangeSelectorManagerService } from '../../services/metrics-range-selector-manager.service'; import { ITimeRange, MetricQueryType } from '../../services/metrics-range-selector.types'; @@ -57,7 +56,7 @@ export class MetricsRangeSelectorComponent implements OnDestroy { action.guid, // Look specifically for metrics entity type for the given endpoint. See #3783 { - entityType: metricEntityType, + entityType: action.entityType, endpointType: action.endpointType } ); diff --git a/src/frontend/packages/core/src/shared/components/no-content-message/no-content-message.component.ts b/src/frontend/packages/core/src/shared/components/no-content-message/no-content-message.component.ts index f3626e8f69..a303a443e2 100644 --- a/src/frontend/packages/core/src/shared/components/no-content-message/no-content-message.component.ts +++ b/src/frontend/packages/core/src/shared/components/no-content-message/no-content-message.component.ts @@ -24,7 +24,7 @@ export class NoContentMessageComponent implements AfterViewInit { @Input() mode: string; - @ViewChild('toolBarLinkElement', { static: false }) toolBarLinkElement: ElementRef; + @ViewChild('toolBarLinkElement') toolBarLinkElement: ElementRef; constructor(private renderer: Renderer2) { } diff --git a/src/frontend/packages/core/src/shared/components/page-header/page-header-events/page-header-events.component.ts b/src/frontend/packages/core/src/shared/components/page-header/page-header-events/page-header-events.component.ts index 6020174c55..eb328ff6f1 100644 --- a/src/frontend/packages/core/src/shared/components/page-header/page-header-events/page-header-events.component.ts +++ b/src/frontend/packages/core/src/shared/components/page-header/page-header-events/page-header-events.component.ts @@ -5,7 +5,7 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { first, map, publishReplay, refCount, share } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../../../../store/src/app-state'; import { endpointEventKey, GlobalEventService, IGlobalEvent } from '../../../global-events.service'; @@ -39,7 +39,7 @@ export class PageHeaderEventsComponent implements OnInit { private events$: Observable; constructor( private activatedRoute: ActivatedRoute, - private store: Store, + private store: Store, private eventService: GlobalEventService, ) { } diff --git a/src/frontend/packages/core/src/shared/components/page-header/page-header.component.ts b/src/frontend/packages/core/src/shared/components/page-header/page-header.component.ts index a253c51cbd..ce65f784ba 100644 --- a/src/frontend/packages/core/src/shared/components/page-header/page-header.component.ts +++ b/src/frontend/packages/core/src/shared/components/page-header/page-header.component.ts @@ -5,10 +5,10 @@ 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 { Logout } from '../../../../../store/src/actions/auth.actions'; import { ToggleSideNav } from '../../../../../store/src/actions/dashboard-actions'; import { AddRecentlyVisitedEntityAction } from '../../../../../store/src/actions/recently-visited.actions'; +import { AppState } from '../../../../../store/src/app-state'; import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; import { selectIsMobile } from '../../../../../store/src/selectors/dashboard.selectors'; import { InternalEventSeverity } from '../../../../../store/src/types/internal-events.types'; @@ -148,7 +148,7 @@ export class PageHeaderComponent implements OnDestroy, AfterViewInit { } constructor( - private store: Store, + private store: Store, private route: ActivatedRoute, private tabNavService: TabNavService, private router: Router, diff --git a/src/frontend/packages/core/src/shared/components/recent-entities/recent-entities.component.ts b/src/frontend/packages/core/src/shared/components/recent-entities/recent-entities.component.ts index cc2bac8f5e..fcd86c1dc6 100644 --- a/src/frontend/packages/core/src/shared/components/recent-entities/recent-entities.component.ts +++ b/src/frontend/packages/core/src/shared/components/recent-entities/recent-entities.component.ts @@ -4,7 +4,7 @@ import * as moment from 'moment'; import { Observable, of as observableOf } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../../../store/src/app-state'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; import { recentlyVisitedSelector } from '../../../../../store/src/selectors/recently-visitied.selectors'; @@ -28,7 +28,7 @@ interface IRelevanceModifiers { class RenderableRecent { public mostRecentHit: moment.Moment; public subText$: Observable; - constructor(readonly entity: IRecentlyVisitedEntity, private store: Store) { + constructor(readonly entity: IRecentlyVisitedEntity, private store: Store) { if (entity.entityType === endpointSchemaKey) { this.subText$ = observableOf(entity.prettyType); } else { @@ -71,7 +71,7 @@ class CountedRecentEntitiesManager { [guid: string]: RenderableRecent }; - constructor(recentState: IRecentlyVisitedState, private store: Store) { + constructor(recentState: IRecentlyVisitedState, private store: Store) { const { entities, hits } = recentState; const mostRecentTime = hits[0] ? moment(hits[0].date) : moment(); @@ -162,7 +162,7 @@ export class RecentEntitiesComponent { public recentEntities$: Observable; public frecentEntities$: Observable; public hasHits$: Observable; - constructor(store: Store) { + constructor(store: Store) { const recentEntities$ = store.select(recentlyVisitedSelector); this.hasHits$ = recentEntities$.pipe( map(recentEntities => recentEntities && !!recentEntities.hits && recentEntities.hits.length > 0) diff --git a/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.ts b/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.ts index 0d18094869..1e0776289c 100644 --- a/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.ts +++ b/src/frontend/packages/core/src/shared/components/stepper/steppers/steppers.component.ts @@ -14,8 +14,8 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; import { catchError, first, map, switchMap } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { IRouterNavPayload, RouterNav } from '../../../../../../store/src/actions/router.actions'; +import { AppState } from '../../../../../../store/src/app-state'; import { getPreviousRoutingState } from '../../../../../../store/src/types/routing.type'; import { LoggerService } from '../../../../core/logger.service'; import { BASE_REDIRECT_QUERY } from '../stepper.types'; @@ -61,7 +61,7 @@ export class SteppersComponent implements OnInit, AfterContentInit, OnDestroy { }>; constructor( private steppersService: SteppersService, - private store: Store, + private store: Store, private snackBar: MatSnackBar, private logger: LoggerService, private route: ActivatedRoute diff --git a/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts b/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts deleted file mode 100644 index 6fa1765b3b..0000000000 --- a/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { combineLatest, Observable } from 'rxjs'; -import { filter, first, map, pairwise, tap } from 'rxjs/operators'; - -import { - CreateUserProvidedServiceInstance, - getUserProvidedServiceInstanceRelations, - IUserProvidedServiceInstanceData, - UpdateUserProvidedServiceInstance, -} from '../../../../cloud-foundry/src/actions/user-provided-service.actions'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - organizationEntityType, - serviceInstancesEntityType, - spaceEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cloud-foundry/src/cf-types'; -import { - UserProvidedServiceActionBuilder, -} from '../../../../cloud-foundry/src/entity-action-builders/user-provided-service.action-builders'; -import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { fetchTotalResults } from '../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; -import { QParam, QParamJoiners } from '../../../../cloud-foundry/src/shared/q-param'; -import { selectCfRequestInfo } from '../../../../cloud-foundry/src/store/selectors/api.selectors'; -import { ClearPaginationOfType } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityCatalogEntityConfig, IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { RequestInfoState } from '../../../../store/src/reducers/api-request-reducer/types'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { IUserProvidedServiceInstance } from '../../core/cf-api-svc.types'; - - -@Injectable() -export class CloudFoundryUserProvidedServicesService { - - private serviceInstancesEntityConfig: EntityCatalogEntityConfig = { - endpointType: CF_ENDPOINT_TYPE, - entityType: serviceInstancesEntityType - }; - - private userProvidedServiceInstancesEntityConfig: EntityCatalogEntityConfig = { - endpointType: CF_ENDPOINT_TYPE, - entityType: userProvidedServiceInstanceEntityType - }; - - private userProvidedServiceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - userProvidedServiceInstanceEntityType - ); - - constructor( - private store: Store, - private entityServiceFactory: EntityServiceFactory, - private paginationMonitorFactory: PaginationMonitorFactory, - ) { - - } - - public getUserProvidedServices(cfGuid: string, spaceGuid?: string, relations = getUserProvidedServiceInstanceRelations) - : Observable[]> { - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfGuid, spaceGuid, null, relations, true); - const pagObs = getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, action.flattenPagination); - return combineLatest([ - pagObs.entities$, // Ensure entities is subbed to the fetch kicks off - pagObs.fetchingEntities$ - ]).pipe( - filter(([, fetching]) => !fetching), - map(([entities]) => entities) - ); - } - - public fetchUserProvidedServiceInstancesCount(cfGuid: string, orgGuid?: string, spaceGuid?: string) - : Observable { - const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; - const uniqueKey = spaceGuid || orgGuid || cfGuid; - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( - createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), - cfGuid, - { includeRelations: [], populateMissing: false } - ) as PaginatedAction; - action.initialParams.q = []; - if (orgGuid) { - action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); - } - if (spaceGuid) { - action.initialParams.q.push(new QParam('space_guid', spaceGuid, QParamJoiners.in).toString()); - } - return fetchTotalResults(action, this.store, this.paginationMonitorFactory); - } - - public getUserProvidedService(cfGuid: string, upsGuid: string): Observable> { - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('get'); - const getUserProvidedServiceAction = actionBuilder(upsGuid, cfGuid); - const service = this.entityServiceFactory.create>( - upsGuid, - getUserProvidedServiceAction - ); - return service.waitForEntity$.pipe( - map(e => e.entity) - ); - } - - public createUserProvidedService( - cfGuid: string, - guid: string, - data: IUserProvidedServiceInstanceData - ): Observable { - const action = new CreateUserProvidedServiceInstance(cfGuid, guid, data, this.userProvidedServiceInstancesEntityConfig); - const create$ = this.store.select(selectCfRequestInfo(userProvidedServiceInstanceEntityType, guid)); - this.store.dispatch(action); - return create$.pipe( - pairwise(), - filter(([oldV, newV]) => oldV.creating && !newV.creating), - map(([, newV]) => newV), - first(), - tap(v => { - if (!v.error) { - // Problem - Lists with multiple actions aren't updated following the creation of an entity based on secondary action - // Here the service instance list (1st action SI, 2nd action UPSI) isn't updated so manually do so - this.store.dispatch(new ClearPaginationOfType(this.serviceInstancesEntityConfig)); - } - }) - ); - } - - updateUserProvidedService( - cfGuid: string, - guid: string, - data: Partial, - ): Observable { - this.userProvidedServiceEntity.actionDispatchManager.dispatchUpdate( - guid, - cfGuid, - data, - this.userProvidedServiceInstancesEntityConfig - ); - return this.userProvidedServiceEntity.getEntityMonitor( - this.store, - guid - ).entityRequest$.pipe( - filter(v => !!v.updating[UpdateUserProvidedServiceInstance.updateServiceInstance]), - pairwise(), - filter(([oldV, newV]) => - oldV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy && - !newV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy), - map(([, newV]) => newV) - ); - } - -} diff --git a/src/frontend/packages/core/src/shared/services/metrics-range-selector.service.ts b/src/frontend/packages/core/src/shared/services/metrics-range-selector.service.ts index 321129e196..ee5b4e64c0 100644 --- a/src/frontend/packages/core/src/shared/services/metrics-range-selector.service.ts +++ b/src/frontend/packages/core/src/shared/services/metrics-range-selector.service.ts @@ -75,7 +75,7 @@ export class MetricsRangeSelectorService { }; } else { return { - timeRange: metrics.query.params && metrics.query.params.window ? + timeRange: metrics.query && metrics.query.params && metrics.query.params.window ? times.find(time => time.value === metrics.query.params.window) : this.getDefaultTimeRange(times) }; diff --git a/src/frontend/packages/core/src/shared/services/side-panel.service.ts b/src/frontend/packages/core/src/shared/services/side-panel.service.ts index e2a13675cd..2b86182a17 100644 --- a/src/frontend/packages/core/src/shared/services/side-panel.service.ts +++ b/src/frontend/packages/core/src/shared/services/side-panel.service.ts @@ -1,8 +1,15 @@ -import { ComponentFactory, ComponentFactoryResolver, ComponentRef, Injectable, ViewContainerRef, Inject } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { + ComponentFactory, + ComponentFactoryResolver, + ComponentRef, + Inject, + Injectable, + ViewContainerRef, +} from '@angular/core'; import { Router } from '@angular/router'; import { asapScheduler, BehaviorSubject, Observable, Subject } from 'rxjs'; import { filter, observeOn, publishReplay, refCount, tap } from 'rxjs/operators'; -import { DOCUMENT } from '@angular/common'; /** * Service to allow the overlay side panel to be shown or hidden. @@ -35,6 +42,10 @@ export class SidePanelService { this.setupRouterListener(); } + public unsetContainer() { + this.container = undefined; + } + public setContainer(container: ViewContainerRef) { if (this.container) { throw new Error('SidePanelService: container already set'); diff --git a/src/frontend/packages/core/src/shared/shared.module.ts b/src/frontend/packages/core/src/shared/shared.module.ts index c380a0c102..b218f0e621 100644 --- a/src/frontend/packages/core/src/shared/shared.module.ts +++ b/src/frontend/packages/core/src/shared/shared.module.ts @@ -5,14 +5,8 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { NgxChartsModule } from '@swimlane/ngx-charts'; -import { - ApplicationInstanceChartComponent, -} from '../../../cloud-foundry/src/features/applications/application/application-instance-chart/application-instance-chart.component'; -import { EntityMonitorFactory } from '../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../store/src/monitors/internal-event-monitor.factory'; -import { PaginationMonitorFactory } from '../../../store/src/monitors/pagination-monitor.factory'; import { CoreModule } from '../core/core.module'; -import { AppNameUniqueDirective } from './app-name-unique.directive/app-name-unique.directive'; import { AppActionMonitorIconComponent } from './components/app-action-monitor-icon/app-action-monitor-icon.component'; import { AppActionMonitorComponent } from './components/app-action-monitor/app-action-monitor.component'; import { @@ -20,7 +14,6 @@ import { } from './components/application-state/application-state-icon/application-state-icon.component'; import { ApplicationStateIconPipe } from './components/application-state/application-state-icon/application-state-icon.pipe'; import { ApplicationStateComponent } from './components/application-state/application-state.component'; -import { ApplicationStateService } from './components/application-state/application-state.service'; import { BlurDirective } from './components/blur.directive'; import { BooleanIndicatorComponent } from './components/boolean-indicator/boolean-indicator.component'; import { BreadcrumbsComponent } from './components/breadcrumbs/breadcrumbs.component'; @@ -28,7 +21,6 @@ import { CardProgressOverlayComponent } from './components/card-progress-overlay import { CardBooleanMetricComponent } from './components/cards/card-boolean-metric/card-boolean-metric.component'; import { CardNumberMetricComponent } from './components/cards/card-number-metric/card-number-metric.component'; import { CardStatusComponent } from './components/cards/card-status/card-status.component'; -import { CfAuthModule } from './components/cf-auth/cf-auth.module'; import { AppChipsComponent } from './components/chips/chips.component'; import { CodeBlockComponent } from './components/code-block/code-block.component'; import { ConfirmationDialogService } from './components/confirmation-dialog.service'; @@ -42,13 +34,11 @@ import { EditableDisplayValueComponent } from './components/editable-display-val import { EndpointsMissingComponent } from './components/endpoints-missing/endpoints-missing.component'; import { EntitySummaryTitleComponent } from './components/entity-summary-title/entity-summary-title.component'; import { EnumerateComponent } from './components/enumerate/enumerate.component'; -import { EnvVarViewComponent } from './components/env-var-view/env-var-view.component'; import { FavoritesEntityListComponent } from './components/favorites-entity-list/favorites-entity-list.component'; import { FavoritesGlobalListComponent } from './components/favorites-global-list/favorites-global-list.component'; import { FavoritesMetaCardComponent } from './components/favorites-meta-card/favorites-meta-card.component'; import { FileInputComponent } from './components/file-input/file-input.component'; import { FocusDirective } from './components/focus.directive'; -import { GithubCommitAuthorComponent } from './components/github-commit-author/github-commit-author.component'; import { IntroScreenComponent } from './components/intro-screen/intro-screen.component'; import { JsonViewerComponent } from './components/json-viewer/json-viewer.component'; import { listCardComponents } from './components/list/list-cards/card.types'; @@ -118,14 +108,12 @@ import { } from './components/upload-progress-indicator/upload-progress-indicator.component'; import { UsageGaugeComponent } from './components/usage-gauge/usage-gauge.component'; import { UserProfileBannerComponent } from './components/user-profile-banner/user-profile-banner.component'; -import { GitSCMService } from './data-services/scm/scm.service'; import { CapitalizeFirstPipe } from './pipes/capitalizeFirstLetter.pipe'; import { MbToHumanSizePipe } from './pipes/mb-to-human-size.pipe'; import { PercentagePipe } from './pipes/percentage.pipe'; import { UptimePipe } from './pipes/uptime.pipe'; import { UsageBytesPipe } from './pipes/usage-bytes.pipe'; import { ValuesPipe } from './pipes/values.pipe'; -import { CloudFoundryUserProvidedServicesService } from './services/cloud-foundry-user-provided-services.service'; import { LongRunningOperationsService } from './services/long-running-op.service'; import { MetricsRangeSelectorService } from './services/metrics-range-selector.service'; import { UserPermissionDirective } from './user-permission.directive'; @@ -138,7 +126,6 @@ import { UserPermissionDirective } from './user-permission.directive'; PageHeaderModule, RouterModule, SteppersModule, - CfAuthModule, CdkTableModule, NgxChartsModule, ], @@ -185,15 +172,12 @@ import { UserPermissionDirective } from './user-permission.directive'; AppChipsComponent, CardBooleanMetricComponent, CardNumberMetricComponent, - EnvVarViewComponent, RingChartComponent, MetricsChartComponent, - ApplicationInstanceChartComponent, StratosTitleComponent, IntroScreenComponent, EnumerateComponent, UploadProgressIndicatorComponent, - GithubCommitAuthorComponent, UserProfileBannerComponent, AppActionMonitorComponent, AppActionMonitorIconComponent, @@ -215,8 +199,6 @@ import { UserPermissionDirective } from './user-permission.directive'; TileSelectorComponent, MarkdownPreviewComponent, MarkdownContentObserverDirective, - AppNameUniqueDirective, - AppNameUniqueDirective, EndpointCardComponent, SimpleUsageChartComponent, PageSubNavComponent, @@ -285,15 +267,12 @@ import { UserPermissionDirective } from './user-permission.directive'; AppChipsComponent, CardBooleanMetricComponent, CardNumberMetricComponent, - EnvVarViewComponent, MetricsChartComponent, - ApplicationInstanceChartComponent, StratosTitleComponent, IntroScreenComponent, UserProfileBannerComponent, EnumerateComponent, UploadProgressIndicatorComponent, - GithubCommitAuthorComponent, AppActionMonitorComponent, AppActionMonitorIconComponent, UserPermissionDirective, @@ -317,12 +296,10 @@ import { UserPermissionDirective } from './user-permission.directive'; TileSelectorComponent, MarkdownPreviewComponent, MarkdownContentObserverDirective, - AppNameUniqueDirective, SimpleUsageChartComponent, EntitySummaryTitleComponent, MarkdownPreviewComponent, MarkdownContentObserverDirective, - AppNameUniqueDirective, PollingIndicatorComponent, UnlimitedInputComponent, JsonViewerComponent, @@ -338,26 +315,17 @@ import { UserPermissionDirective } from './user-permission.directive'; ], entryComponents: [ DialogConfirmComponent, - EnvVarViewComponent, SnackBarReturnComponent, MarkdownPreviewComponent, ], providers: [ ListConfig, - ApplicationStateService, EndpointListHelper, EndpointsListConfigService, - // CfUserService, ConfirmationDialogService, - EntityMonitorFactory, - PaginationMonitorFactory, - // CloudFoundryService, InternalEventMonitorFactory, - // ServiceActionHelperService, MetricsRangeSelectorService, - GitSCMService, LongRunningOperationsService, - CloudFoundryUserProvidedServicesService ] }) export class SharedModule { } diff --git a/src/frontend/packages/core/src/shared/shared.types.ts b/src/frontend/packages/core/src/shared/shared.types.ts index d5cdae0c6d..a3da5a1e89 100644 --- a/src/frontend/packages/core/src/shared/shared.types.ts +++ b/src/frontend/packages/core/src/shared/shared.types.ts @@ -1,4 +1,4 @@ -import { CFAppState } from '../../../cloud-foundry/src/cf-app-state'; +import { AppState } from '../../../store/src/app-state'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; @@ -16,7 +16,13 @@ export enum StratosStatus { BUSY = 'busy' } -export type PartialAppState = Partial; +export interface StratosStatusMetadata { + label: string; + subLabel?: string; + indicator: StratosStatus; +} + +export type PartialAppState = Partial; -export type PickAppState = keyof CFAppState; +export type PickAppState = keyof AppState; diff --git a/src/frontend/packages/core/src/shared/user-permission.directive.spec.ts b/src/frontend/packages/core/src/shared/user-permission.directive.spec.ts index 86d356647a..6e3ea57118 100644 --- a/src/frontend/packages/core/src/shared/user-permission.directive.spec.ts +++ b/src/frontend/packages/core/src/shared/user-permission.directive.spec.ts @@ -1,16 +1,15 @@ import { Component, TemplateRef } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { BaseTestModules } from '../../test-framework/core-test.helper'; +import { BaseTestModules, generateBaseTestStoreModules } from '../../test-framework/core-test.helper'; +import { UserPermissionDirective } from './user-permission.directive'; @Component({ - template: `(store, entityId, this.entityKey, this.getSchema(schemaKey), startWithNull); - } - public getTypeAndSubtype() { const type = this.definition.parentType || this.definition.type; const subType = this.definition.parentType ? this.definition.type : null; @@ -223,14 +256,30 @@ export class StratosBaseCatalogEntity< this.definition.paginationConfig : null; } + + public getEntityEmitHandler(): EntityInfoHandler { + return this.definition.entityEmitHandler; + } + + public getEntitiesEmitHandler(): EntitiesInfoHandler { + return this.definition.entitiesEmitHandler; + } + + public getEntityFetchHandler(): EntityFetchHandler { + return this.definition.entityFetchHandler; + } + + public getEntitiesFetchHandler(): EntitiesFetchHandler { + return this.definition.entitiesFetchHandler; + } } export class StratosCatalogEntity< T extends IEntityMetadata = IEntityMetadata, Y = any, AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders, - ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders - > extends StratosBaseCatalogEntity { + ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders, + > extends StratosBaseCatalogEntity { public definition: IStratosEntityDefinition; constructor( entity: IStratosEntityDefinition, @@ -244,6 +293,26 @@ export class StratosCatalogEntity< this.definition.paginationConfig : this.definition.endpoint ? this.definition.endpoint.paginationConfig : null; } + + public getEntityEmitHandler(): EntityInfoHandler { + return this.definition.entityEmitHandler || + this.definition.endpoint ? this.definition.endpoint.entityEmitHandler : null; + } + + public getEntitiesEmitHandler(): EntitiesInfoHandler { + return this.definition.entitiesEmitHandler || + this.definition.endpoint ? this.definition.endpoint.entitiesEmitHandler : null + } + + public getEntityFetchHandler(): EntityFetchHandler { + return this.definition.entityFetchHandler || + this.definition.endpoint ? this.definition.endpoint.entityFetchHandler : null; + } + + public getEntitiesFetchHandler(): EntitiesFetchHandler { + return this.definition.entitiesFetchHandler || + this.definition.endpoint ? this.definition.endpoint.entitiesFetchHandler : null; + } } export class StratosCatalogEndpointEntity extends StratosBaseCatalogEntity { @@ -284,3 +353,4 @@ export class StratosCatalogEndpointEntity extends StratosBaseCatalogEntity { + /** + * Return a collection of observables for the given entity id. If the entity is missing is will NOT be fetched + */ + getEntityMonitor: ( + entityId: string, + params?: { + schemaKey?: string, + startWithNull?: boolean + } + ) => EntityMonitor; + /** + * Return a collection of observables for the given entity id. Subscribing to core observables (like entityObs$) will fetch the entity if missing + */ + getEntityService: ( + ...args: Parameters + ) => EntityService; + /** + * Return a collection of observables for the given collection of entities. If the collection is missing it will NOT be fetched + */ + getPaginationMonitor: ( + ...args: Parameters + ) => PaginationMonitor; + /** + * Return a collection of observables for the given collection of entities. Subscribing to core (like entities$) will fetch the entity if missing + */ + getPaginationService: ( + ...args: Parameters + ) => PaginationObservables; +} + +/** + * Filter out all common builders in OrchestratedActionCoreBuilders from ABC + */ +type CustomBuilders = Omit>, keyof OrchestratedActionCoreBuilders>; + +/** + * Mark builders that don't return a pagination action as `never` + */ +type PaginatedActionBuildersWithNevers = FilteredByReturnType, PaginatedAction>; +/** + * Filter out builders that don't return pagination actions from ABC + */ +type PaginatedActionBuilders = Omit, NeverKeys>> + +/** + * Mark builders that return a pagination action as `never` + */ +type NonPaginatedActionBuildersWithNevers = FilteredByNotReturnType, PaginatedAction>; +/** + * Filter out builders that return pagination actions from ABC + */ +type NonPaginatedActionBuilders = Omit, NeverKeys>> + + +/** + * Provided a typed way to create pagination monitor/service per action (this ultimately only provides ones for paginated actions) + */ +type EntityCatalogEntityStoreCollections> = { + [K in keyof PABC]: { + getPaginationMonitor: ( + ...args: Parameters + ) => PaginationMonitor; + getPaginationService: ( + ...args: Parameters + ) => PaginationObservables; + } +}; + +/** + * Provided a typed way to create entity monitor/service per action (this ultimately only provides ones for non-paginated actions) + */ +type EntityCatalogEntityStoreSingles> = { + [K in keyof SABC]: { + getEntityMonitor: ( + startWithNull: boolean, + ...args: Parameters + ) => EntityMonitor; + getEntityService: ( + ...args: Parameters + ) => EntityService + } +}; + +export type CustomEntityCatalogEntityStore = + EntityCatalogEntityStoreCollections> & + EntityCatalogEntityStoreSingles> + + +/** + * Combine all types of store + * - CoreEntityCatalogEntityStore (entity and entities store access) + * - EntityCatalogEntityStoreCollections (per entity custom entities lists) + * - EntityCatalogEntityStoreSingles (per entity custom entity's) + */ +export type EntityCatalogEntityStore = + CoreEntityCatalogEntityStore & + CustomEntityCatalogEntityStore + + + diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts new file mode 100644 index 0000000000..ededbee860 --- /dev/null +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; + +import { AppState } from '../../app-state'; +import { EntityServiceFactory } from '../../entity-service-factory.service'; +import { PaginationMonitorFactory } from '../../monitors/pagination-monitor.factory'; +import { getPaginationObservables } from '../../reducers/pagination-reducer/pagination-reducer.helper'; + +@Injectable() +export class EntityCatalogHelper { + + // Remove cyclic dependency by accessing this here instead of in entity catalog entity + public getPaginationObservables = getPaginationObservables; + + constructor( + public esf: EntityServiceFactory, + public pmf: PaginationMonitorFactory, + public store: Store, + ) { + + } +} diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts index cd1663bf8a..c4fc7b45f8 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts @@ -1,3 +1,5 @@ +import { EntityCatalogHelper } from './entity-catalog-entity/entity-catalog.service'; + export abstract class EntityCatalogHelpers { static readonly endpointType = 'endpoint'; static buildEntityKey(entityType: string, endpointType: string): string { @@ -10,4 +12,12 @@ export abstract class EntityCatalogHelpers { // Camelcased to make it work better with the store. return `${endpointType}${entityType.charAt(0).toUpperCase() + entityType.slice(1)}`; } + + private static Instance: EntityCatalogHelper; + static SetEntityCatalogHelper(ecf: EntityCatalogHelper) { + this.Instance = ecf; + } + static GetEntityCatalogHelper(): EntityCatalogHelper { + return this.Instance; + } } diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts similarity index 95% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts index 352c91f1e0..7f7a44f245 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts @@ -1,10 +1,12 @@ -import { EntitySchema } from '../helpers/entity-schema'; import { endpointEntitySchema } from '../../../core/src/base-entity-schemas'; import { BaseEndpointAuth } from '../../../core/src/features/endpoints/endpoint-auth'; -import { EndpointListDetailsComponent } from '../../../core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers'; -import { StratosCatalogEndpointEntity, StratosCatalogEntity } from './entity-catalog-entity'; -import { TestEntityCatalog } from './entity-catalog.service'; -import { IStratosEndpointDefinition, EntityCatalogSchemas } from './entity-catalog.types'; +import { + EndpointListDetailsComponent, +} from '../../../core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers'; +import { EntitySchema } from '../helpers/entity-schema'; +import { TestEntityCatalog } from './entity-catalog'; +import { StratosCatalogEndpointEntity, StratosCatalogEntity } from './entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogSchemas, IStratosEndpointDefinition } from './entity-catalog.types'; describe('EntityCatalogService', () => { let entityCatalog: TestEntityCatalog; diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts index fb9eb2b43d..4082342470 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts @@ -1,19 +1,4 @@ import { IRequestTypeState } from '../app-state'; -import { entityCatalog } from './entity-catalog.service'; - -// FIXME: These should be removed/come from the entity catalog - STRAT-151 -const baseEntities = [ - 'user', - 'system' -]; - -export function getAllEntityStoreKeys() { - const entities = entityCatalog.getAllEntitiesTypes(); - return [ - ...entities.map(entity => entity.entityKey), - ...baseEntities - ]; -} export function getDefaultStateFromEntityCatalog(entityKeys: string[], defaultState: T, initialState: IRequestTypeState) { return entityKeys.reduce((currentState, entityKey) => { diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.ts similarity index 86% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog.ts index 68faff02eb..d10b67359f 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.ts @@ -1,12 +1,12 @@ +import { STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; import { IRequestEntityTypeState } from '../app-state'; import { ExtraApiReducers } from '../reducers/api-request-reducers.generator.helpers'; -import { STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; import { OrchestratedActionBuilders } from './action-orchestrator/action-orchestrator'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from './entity-catalog-entity'; +} from './entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogHelpers } from './entity-catalog.helper'; import { EntityCatalogEntityConfig, IEntityMetadata, IStratosBaseEntityDefinition } from './entity-catalog.types'; @@ -103,25 +103,36 @@ class EntityCatalog { return this.entities.get(entityKey) || this.endpoints.get(entityKey); } - /* tslint:disable:max-line-length */ - public getEntity( + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders + >( entityConfig: EntityCatalogEntityConfig - ): StratosBaseCatalogEntity; - public getEntity( - endpointType: string, - entityType: string, - subType?: string - ): StratosBaseCatalogEntity; - public getEntity( - endpointTypeOrConfig: string | EntityCatalogEntityConfig, - entityType?: string, - subType?: string - ): StratosBaseCatalogEntity { + ): StratosBaseCatalogEntity; + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders, + >( + endpointType: string, + entityType: string, + subType?: string + ): StratosBaseCatalogEntity; + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders, + >( + endpointTypeOrConfig: string | EntityCatalogEntityConfig, + entityType?: string, + subType?: string + ): StratosBaseCatalogEntity { /* tslint:enable:max-line-length */ const config = this.getConfig(endpointTypeOrConfig, entityType, subType); const entityOfType = this.getEntityOfType(config.entityType, config.endpointType); if (entityOfType && subType) { - return this.getEntitySubType(entityOfType, subType) as StratosBaseCatalogEntity; + return this.getEntitySubType(entityOfType, subType) as StratosBaseCatalogEntity; } if (!entityOfType) { console.warn( @@ -129,7 +140,7 @@ class EntityCatalog { new Error().stack ); } - return entityOfType as StratosBaseCatalogEntity; + return entityOfType as StratosBaseCatalogEntity; } public getEntityKey(endpointType: string, entityType: string): string; @@ -203,4 +214,4 @@ export class TestEntityCatalog extends EntityCatalog { // https://github.com/cloudfoundry-incubator/stratos/issues/3753 - Reverting the entity catalog to an Angular service // makes testing much easier and remove the need for this. /* tslint:disable-next-line:no-string-literal */ -export const entityCatalog = !!window['__karma__'] ? new TestEntityCatalog() : new EntityCatalog(); +export const entityCatalog: EntityCatalog = !!window['__karma__'] ? new TestEntityCatalog() : new EntityCatalog(); diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts index 80e9d7a61a..130194253b 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts @@ -1,12 +1,17 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { EndpointHealthCheck } from '../../../core/endpoints-health-checks'; import { EndpointAuthTypeConfig } from '../../../core/src/core/extension/extension-types'; -import { Omit } from '../../../core/src/core/utils.service'; +import { FavoritesConfigMapper } from '../../../core/src/shared/components/favorites-meta-card/favorite-config-mapper'; import { StratosStatus } from '../../../core/src/shared/shared.types'; import { GeneralEntityAppState } from '../app-state'; import { ApiErrorMessageHandler, + EntitiesFetchHandler, + EntitiesInfoHandler, + EntityFetchHandler, + EntityInfoHandler, PreApiRequest, PrePaginationApiRequest, SuccessfulApiResponseDataMapper, @@ -15,6 +20,7 @@ import { PaginationPageIteratorConfig, } from '../entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe'; import { EntitySchema } from '../helpers/entity-schema'; +import { UserFavorite } from '../types/user-favorites.types'; export interface EntityCatalogEntityConfig { entityType: string; @@ -69,6 +75,22 @@ export interface IStratosBaseEntityDefinition[]; readonly paginationConfig?: PaginationPageIteratorConfig; readonly tableConfig?: EntityTableConfig; + /** + * Hook that will fire before an entity is emitted by an entity service. This could be used, for example, entity validation + */ + readonly entityEmitHandler?: EntityInfoHandler; + /** + * Hook that will fire before an entity is emitted by an entity service. This could be used, for example, entity validation + */ + readonly entitiesEmitHandler?: EntitiesInfoHandler; + /** + * Hook that can override the way an entity is fetched + */ + readonly entityFetchHandler?: EntityFetchHandler; + /** + * Hook that can override the way entities are fetched + */ + readonly entitiesFetchHandler?: EntitiesFetchHandler; } @@ -90,14 +112,23 @@ export interface IStratosEndpointDefinition[]; - // Allows an entity to manipulate the data that is returned from an api request before it makes it into the store. - // This will be used for all entities with this endpoint type. + + /** + * Allows an entity to manipulate the data that is returned from an api request before it makes it into the store. + * This will be used for all entities with this endpoint type. + */ readonly globalSuccessfulRequestDataMapper?: SuccessfulApiResponseDataMapper; - // Allows an entity to manipulate the request object before it's sent. - // This will be used for all entities with this endpoint type unless the entity has it's own prerequest config. + /** + * Allows an entity to manipulate the request object before it's sent. + * This will be used for all entities with this endpoint type unless the entity has it's own prerequest config. + */ readonly globalPreRequest?: PreApiRequest; readonly globalPrePaginationRequest?: PrePaginationApiRequest; readonly globalErrorMessageHandler?: ApiErrorMessageHandler; + readonly healthCheck?: EndpointHealthCheck; + readonly favoriteFromEntity?: ( + entity: any, entityKey: string, favoritesConfigMapper: FavoritesConfigMapper + ) => UserFavorite; } export interface StratosEndpointExtensionDefinition extends Omit { } diff --git a/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts index 6672986f46..f8ac38b4ca 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts @@ -2,20 +2,20 @@ import { Action, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; -import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { AppState, InternalAppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { EntityRequestAction } from '../types/request.types'; import { buildRequestEntityPipe } from './entity-request-base-handlers/build-entity-request.pipe'; import { handleJetstreamResponsePipeFactory, - handleNonJetstreamResponsePipeFactory + handleNonJetstreamResponsePipeFactory, } from './entity-request-base-handlers/handle-multi-endpoints.pipe'; import { makeRequestEntityPipe } from './entity-request-base-handlers/make-request-entity-request.pipe'; import { mapMultiEndpointResponses } from './entity-request-base-handlers/map-multi-endpoint.pipes'; import { BasePipelineConfig, EntityRequestPipeline, PipelineResult } from './entity-request-pipeline.types'; -import { singleRequestToPaged, isJetstreamRequest } from './pipeline-helpers'; +import { isJetstreamRequest, singleRequestToPaged } from './pipeline-helpers'; import { PipelineHttpClient } from './pipline-http-client.service'; export interface SingleRequestPipelineConfig extends BasePipelineConfig { diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts index a2bbe9bb6b..fa82840e99 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts @@ -4,8 +4,11 @@ import { isObservable, Observable, of } from 'rxjs'; import { first, map, switchMap } from 'rxjs/operators'; import { AppState, InternalAppState } from '../app-state'; -import { StratosBaseCatalogEntity, StratosCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, + StratosCatalogEntity, +} from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { PaginationFlattenerConfig } from '../helpers/paginated-request-helpers'; import { selectPaginationState } from '../selectors/pagination.selectors'; @@ -49,17 +52,17 @@ function getRequestObservable( request: HttpRequest, paginationPageIterator?: PaginationPageIterator ): Observable { - const initialRequest = makeRequestEntityPipe( - httpClient, - request, - entityCatalog.getEndpoint(action.endpointType, action.subType), - action.endpointGuid, - action.externalRequest - ); if (action.flattenPagination && !paginationPageIterator) { console.warn('Action requires all request pages but no page flattener was given.'); } if (!action.flattenPagination || !paginationPageIterator) { + const initialRequest = makeRequestEntityPipe( + httpClient, + request, + entityCatalog.getEndpoint(action.endpointType, action.subType), + action.endpointGuid, + action.externalRequest + ); return initialRequest.pipe(map(response => singleRequestToPaged(response))); } return paginationPageIterator.mergeAllPagesEntities(); diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts index 2e39ebde17..d03761d51c 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts @@ -1,7 +1,7 @@ import { Action } from '@ngrx/store'; import { SendEventAction } from '../../actions/internal-events.actions'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { InternalEventSeverity } from '../../types/internal-events.types'; import { APISuccessOrFailedAction, EntityRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts index 6ff1efc269..8b6fc07532 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts @@ -1,5 +1,5 @@ import { SendEventAction } from '../../actions/internal-events.actions'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../helpers/entity-factory'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { InternalEventSeverity, InternalEventStateMetadata } from '../../types/internal-events.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts index d930e58ec7..26f25612a6 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts @@ -1,4 +1,4 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { EntityRequestAction } from '../../types/request.types'; import { failedEntityHandler } from './fail-entity-request.handler'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts index 9d0803744b..ebe6478295 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts @@ -1,5 +1,5 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; import { RecursiveDeleteFailed } from '../../effects/recursive-entity-delete.effect'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { EntityRequestAction, WrapperRequestActionFailed } from '../../types/request.types'; import { ActionDispatcher, PipelineResult } from '../entity-request-pipeline.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts index 01c607cd4b..9eaeb471ca 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginatedAction } from '../../types/pagination.types'; import { EntityRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts index 950dd6c51b..d68ddd27ab 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts @@ -1,6 +1,6 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; import { SendEventAction } from '../../actions/internal-events.actions'; import { RecursiveDeleteFailed } from '../../effects/recursive-entity-delete.effect'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../helpers/entity-factory'; import { ApiRequestTypes, getFailApiRequestActions } from '../../reducers/api-request-reducer/request-helpers'; import { GLOBAL_EVENT, InternalEventSeverity, InternalEventStateMetadata } from '../../types/internal-events.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts index 9748006ba2..b6bd9dfeac 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts @@ -1,7 +1,7 @@ import { HttpRequest } from '@angular/common/http'; import { switchMap } from 'rxjs/operators'; -import { StratosCatalogEndpointEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosCatalogEndpointEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { MakeEntityRequestPipe } from '../entity-request-pipeline.types'; export const makeRequestEntityPipe: MakeEntityRequestPipe = ( diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts index b078c3d189..953c96884d 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts @@ -1,8 +1,8 @@ import { Action } from '@ngrx/store'; import { normalize } from 'normalizr'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../../entity-catalog/entity-catalog.types'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from '../../types/api.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts index 9efad1f5ca..4c88fa24ad 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts @@ -1,4 +1,4 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { EntityRequestAction } from '../../types/request.types'; import { startEntityHandler } from './start-entity-request.handler'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts index bf0d187b9e..9302a6a42c 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts @@ -1,8 +1,8 @@ import { CF_ENDPOINT_TYPE } from '../../../../cloud-foundry/src/cf-types'; import { ClearPaginationOfEntity, ClearPaginationOfType } from '../../actions/pagination.actions'; import { RecursiveDeleteComplete } from '../../effects/recursive-entity-delete.effect'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { WrapperRequestActionSuccess } from '../../types/request.types'; export function successEntityHandler( diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts index fb7ef8483e..2fbc4f3eda 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts @@ -5,8 +5,8 @@ import { catchError, map, tap } from 'rxjs/operators'; import { isHttpErrorResponse } from '../../../core/src/jetstream.helpers'; import { AppState, InternalAppState } from '../app-state'; import { RecursiveDelete } from '../effects/recursive-entity-delete.effect'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes, getRequestTypeFromMethod } from '../reducers/api-request-reducer/request-helpers'; import { PaginatedAction } from '../types/pagination.types'; import { EntityRequestAction } from '../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts index c6b24fd81b..bc71e61254 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts @@ -2,15 +2,15 @@ import { HttpRequest } from '@angular/common/http'; import { Action, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { JetStreamErrorResponse } from '../../../core/src/jetstream.helpers'; +import { AppState, GeneralEntityAppState, InternalAppState } from '../app-state'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, -} from '../entity-catalog/entity-catalog-entity'; -import { JetStreamErrorResponse } from '../../../core/src/jetstream.helpers'; -import { AppState, InternalAppState } from '../app-state'; +} from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes } from '../reducers/api-request-reducer/request-helpers'; -import { NormalizedResponse } from '../types/api.types'; -import { PaginatedAction } from '../types/pagination.types'; +import { EntityInfo, NormalizedResponse } from '../types/api.types'; +import { PaginatedAction, PaginationEntityState } from '../types/pagination.types'; import { EntityRequestAction } from '../types/request.types'; import { JetstreamError } from './entity-request-base-handlers/handle-multi-endpoints.pipe'; import { PipelineHttpClient } from './pipline-http-client.service'; @@ -121,3 +121,17 @@ export interface BasePipelineConfig { [endpointId: string]: T[] | JetStreamErrorResponse[]; } + +export type EntityInfoHandler = (action: EntityRequestAction, actionDispatcher: ActionDispatcher) => (entityInfo: EntityInfo) => void; + +export type EntitiesInfoHandler = ( + action: PaginatedAction | PaginatedAction[], + actionDispatcher: ActionDispatcher, +) => ( + state: PaginationEntityState, + ) => void; + + +export type EntityFetch = (entity: T) => void; +export type EntityFetchHandler = (store: Store, action: EntityRequestAction) => EntityFetch; +export type EntitiesFetchHandler = (store: Store, actions: PaginatedAction[]) => () => void; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts index 2ccb2a0856..d02ef516b6 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts @@ -1,9 +1,6 @@ import { HttpParams } from '@angular/common/http'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { InternalAppState } from '../../app-state'; import { resultPerPageParam, resultPerPageParamDefault } from '../../reducers/pagination-reducer/pagination-reducer.types'; -import { selectPaginationState } from '../../selectors/pagination.selectors'; import { PaginatedAction, PaginationEntityState, PaginationParam } from '../../types/pagination.types'; export function getPaginationParams(paginationState: PaginationEntityState): PaginationParam { diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts index 1038a7e569..aeb8a466f6 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts @@ -1,11 +1,11 @@ import { HttpRequest } from '@angular/common/http'; import { Store } from '@ngrx/store'; import { combineLatest, Observable, of, range } from 'rxjs'; -import { map, mergeMap, reduce, switchMap } from 'rxjs/operators'; +import { first, map, mergeMap, reduce, switchMap } from 'rxjs/operators'; import { UpdatePaginationMaxedState } from '../../actions/pagination.actions'; import { AppState } from '../../app-state'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginatedAction, PaginationMaxedState } from '../../types/pagination.types'; import { ActionDispatcher, JetstreamResponse, PagedJetstreamResponse } from '../entity-request-pipeline.types'; import { PipelineHttpClient } from '../pipline-http-client.service'; @@ -95,10 +95,9 @@ export class PaginationPageIterator { private handleRequests(initialResponse: JetstreamResponse, action: PaginatedAction, totalPages: number, totalResults: number): Observable<[JetstreamResponse, JetstreamResponse[]]> { - const allResults = combineLatest(of(initialResponse), this.getAllOtherPageRequests(totalPages)); - + const createAllResults = () => combineLatest(of(initialResponse), this.getAllOtherPageRequests(totalPages)); if (totalResults === 0 || (this.paginationMaxedState && this.paginationMaxedState.ignoreMaxed)) { - return allResults; + return createAllResults(); } return this.config.maxedStateStartAt(this.store, action).pipe( @@ -114,7 +113,7 @@ export class PaginationPageIterator { ); return combineLatest([of(initialResponse), of([])]); } - return allResults; + return createAllResults(); }) ); } @@ -126,7 +125,7 @@ export class PaginationPageIterator { public mergeAllPagesEntities(): Observable { const initialRequest = this.addPageToRequest(1); return this.makeRequest(initialRequest).pipe( - mergeMap(initialResponse => { + switchMap(initialResponse => { const totalPages = this.config.getTotalPages(initialResponse); const totalResults = this.config.getTotalEntities(initialResponse); return this.handleRequests( @@ -135,6 +134,7 @@ export class PaginationPageIterator { this.getValidNumber(totalPages), this.getValidNumber(totalResults) ).pipe( + first(), map(([initialRequestResponse, othersResponse]) => [initialRequestResponse, ...othersResponse]), map(responsePages => this.reducePages(responsePages)), ); diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts b/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts index 9c03bc9d79..e587aed932 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts @@ -1,6 +1,4 @@ -import { HttpParams } from '@angular/common/http'; - -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { JetstreamResponse, PagedJetstreamResponse } from './entity-request-pipeline.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts b/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts index 9cf1fd1bac..863ac58cef 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts @@ -6,7 +6,7 @@ import { filter, first, map, mergeMap } from 'rxjs/operators'; import { environment } from '../../../core/src/environments/environment'; import { InternalAppState } from '../app-state'; -import { StratosCatalogEndpointEntity } from '../entity-catalog/entity-catalog-entity'; +import { StratosCatalogEndpointEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEndpointDefinition } from '../entity-catalog/entity-catalog.types'; import { connectedEndpointsOfTypesSelector, endpointOfTypeSelector } from '../selectors/endpoint.selectors'; diff --git a/src/frontend/packages/store/src/entity-service-factory.service.ts b/src/frontend/packages/store/src/entity-service-factory.service.ts index d320c5779d..0fcf144042 100644 --- a/src/frontend/packages/store/src/entity-service-factory.service.ts +++ b/src/frontend/packages/store/src/entity-service-factory.service.ts @@ -1,12 +1,12 @@ -import { Inject, Injectable, Optional } from '@angular/core'; +import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { GeneralEntityAppState } from './app-state'; -import { EntityRequestAction } from './types/request.types'; -import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; -import { entityCatalog } from './entity-catalog/entity-catalog.service'; +import { entityCatalog } from './entity-catalog/entity-catalog'; import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; -import { ENTITY_INFO_HANDLER, EntityInfoHandler, EntityService } from './entity-service'; +import { EntityService } from './entity-service'; +import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; +import { EntityRequestAction } from './types/request.types'; @Injectable() export class EntityServiceFactory { @@ -19,7 +19,6 @@ export class EntityServiceFactory { constructor( private store: Store, private entityMonitorFactory: EntityMonitorFactory, - @Optional() @Inject(ENTITY_INFO_HANDLER) private entityInfoHandler: EntityInfoHandler ) { } // FIXME: See #3833. Improve typing of action passed to entity service factory create @@ -50,9 +49,9 @@ export class EntityServiceFactory { config.entityGuid, config.endpointGuid, config.actionMetadata || {} - ), this.entityInfoHandler); + )); } - return new EntityService(this.store, entityMonitor, action, this.entityInfoHandler); + return new EntityService(this.store, entityMonitor, action); } } diff --git a/src/frontend/packages/store/src/entity-service.spec.ts b/src/frontend/packages/store/src/entity-service.spec.ts index b8a4a290e5..e0e752ada8 100644 --- a/src/frontend/packages/store/src/entity-service.spec.ts +++ b/src/frontend/packages/store/src/entity-service.spec.ts @@ -4,27 +4,25 @@ import { inject, TestBed } from '@angular/core/testing'; import { Action, Store } from '@ngrx/store'; import { filter, first, map, pairwise, tap } from 'rxjs/operators'; +import { STRATOS_ENDPOINT_TYPE } from '../../core/src/base-entity-schemas'; +import { ENTITY_SERVICE } from '../../core/src/shared/entity.tokens'; +import { generateTestEntityServiceProvider } from '../../core/test-framework/entity-service.helper'; +import { createEntityStore, TestStoreEntity } from '../testing/src/store-test-helper'; import { APIResponse } from './actions/request.actions'; import { GeneralAppState } from './app-state'; -import { - failedEntityHandler, -} from './entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler'; +import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from './entity-catalog-test.module'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogEntityConfig, IStratosEndpointDefinition } from './entity-catalog/entity-catalog.types'; +import { failedEntityHandler } from './entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler'; import { PipelineResult } from './entity-request-pipeline/entity-request-pipeline.types'; +import { EntityService } from './entity-service'; +import { EntityServiceFactory } from './entity-service-factory.service'; import { EntitySchema } from './helpers/entity-schema'; +import { EntityMonitor } from './monitors/entity-monitor'; +import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; import { completeApiRequest, startApiRequest } from './reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from './types/api.types'; import { EntityRequestAction, ICFAction } from './types/request.types'; -import { generateTestEntityServiceProvider } from '../../core/test-framework/entity-service.helper'; -import { createEntityStore, TestStoreEntity } from '../testing/src/store-test-helper'; -import { STRATOS_ENDPOINT_TYPE } from '../../core/src/base-entity-schemas'; -import { ENTITY_SERVICE } from '../../core/src/shared/entity.tokens'; -import { EntityMonitor } from './monitors/entity-monitor'; -import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; -import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from './entity-catalog-test.module'; -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; -import { EntityCatalogEntityConfig, IStratosEndpointDefinition } from './entity-catalog/entity-catalog.types'; -import { EntityService } from './entity-service'; -import { EntityServiceFactory } from './entity-service-factory.service'; function getActionDispatcher(store: Store) { return (action: Action) => { diff --git a/src/frontend/packages/store/src/entity-service.ts b/src/frontend/packages/store/src/entity-service.ts index 0b3e3066b2..5d583342dd 100644 --- a/src/frontend/packages/store/src/entity-service.ts +++ b/src/frontend/packages/store/src/entity-service.ts @@ -1,21 +1,17 @@ -import { Inject, Optional } from '@angular/core'; import { compose, Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { GeneralEntityAppState } from './app-state'; -import { ActionDispatcher } from './entity-request-pipeline/entity-request-pipeline.types'; +import { entityCatalog } from './entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; +import { EntityFetch, EntityFetchHandler } from './entity-request-pipeline/entity-request-pipeline.types'; +import { EntityMonitor } from './monitors/entity-monitor'; import { RequestInfoState, UpdatingSection } from './reducers/api-request-reducer/types'; -import { getEntityUpdateSections, getUpdateSectionById } from './selectors/api.selectors'; +import { getEntityUpdateSections, getUpdateSectionById, selectEntity } from './selectors/api.selectors'; import { EntityInfo } from './types/api.types'; import { EntityRequestAction } from './types/request.types'; -import { EntityMonitor } from './monitors/entity-monitor'; -import { entityCatalog } from './entity-catalog/entity-catalog.service'; -import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; - -export const ENTITY_INFO_HANDLER = '__ENTITY_INFO_HANDLER__'; - -export type EntityInfoHandler = (action: EntityRequestAction, actionDispatcher: ActionDispatcher) => (entityInfo: EntityInfo) => void; export function isEntityBlocked(entityRequestInfo: RequestInfoState) { if (!entityRequestInfo) { @@ -25,19 +21,36 @@ export function isEntityBlocked(entityRequestInfo: RequestInfoState) { entityRequestInfo.error || entityRequestInfo.deleting.busy || entityRequestInfo.deleting.deleted; - // TODO: RC test removal of updating._root_.busy } -const dispatcherFactory = (store: Store, action: EntityRequestAction) => (updatingKey?: string) => { - if (updatingKey) { - store.dispatch({ +type ActionDispatcher = (updatingKey?: string, fetchEntity?: boolean) => EntityFetch; +const dispatcherFactory = ( + store: Store, + action: EntityRequestAction, + catalogEntity: StratosBaseCatalogEntity, + +): ActionDispatcher => + (updatingKey?: string, fetchEntity?: boolean) => { + // If we're dispatching the action in the updating world ensure the key is set + const updatedAction = { ...action, updatingKey - }); - } else { - store.dispatch(action); - } -}; + } + + // Do we have a fetch handler defined by the endpoint/entity? + const entityFetchHandler: EntityFetchHandler = catalogEntity.getEntityFetchHandler() + const fetchHandler = entityFetchHandler ? + entityFetchHandler(store, updatedAction) : + (entity: T) => store.dispatch(updatedAction); + + // Fetch handler requires the entity, this may be missing or stale to update if required + return fetchEntity ? (entity: T) => { + // Entity may be null or stale + store.select(selectEntity(catalogEntity.entityKey, action.guid)).pipe(first()).subscribe(entity => fetchHandler(entity)) + fetchHandler(entity) + } : fetchHandler; + }; + /** * Designed to be used in a service factory provider @@ -48,16 +61,22 @@ export class EntityService { store: Store, public entityMonitor: EntityMonitor, actionOrConfig: EntityRequestAction | EntityActionBuilderEntityConfig, - @Optional() @Inject(ENTITY_INFO_HANDLER) entityInfoHandlerBuilder?: EntityInfoHandler ) { this.action = this.getAction(actionOrConfig); - const actionInfoHandler = entityInfoHandlerBuilder ? entityInfoHandlerBuilder( + const catalogEntity = entityCatalog.getEntity(this.action); + + // Setup Fetch Handler + this.actionDispatch = dispatcherFactory(store, this.action, catalogEntity); + + // Setup Emit Handler + const entityEmitHandlerBuilder = catalogEntity.getEntityEmitHandler(); + const entityEmitHandler = entityEmitHandlerBuilder ? entityEmitHandlerBuilder( this.action, (action) => store.dispatch(action) ) : () => { }; - this.actionDispatch = dispatcherFactory(store, this.action); + this.updateEntity = () => { - this.actionDispatch(this.refreshKey); + this.actionDispatch(this.refreshKey, true)(null); }; this.updatingSection$ = entityMonitor.updatingSection$; @@ -65,11 +84,11 @@ export class EntityService { this.isFetchingEntity$ = entityMonitor.isFetchingEntity$; this.entityObs$ = this.getEntityObservable( entityMonitor, - this.actionDispatch, + this.actionDispatch(), ).pipe( publishReplay(1), refCount(), - tap(actionInfoHandler) + tap(entityEmitHandler) ); this.waitForEntity$ = this.entityObs$.pipe( @@ -84,7 +103,7 @@ export class EntityService { refreshKey = 'updating'; - private actionDispatch: (key: string) => void; + private actionDispatch: ActionDispatcher; updateEntity: () => void; @@ -99,14 +118,15 @@ export class EntityService { updatingSection$: Observable; private getEntityObservable = ( entityMonitor: EntityMonitor, - actionDispatch: (key?: string) => void + actionDispatch: EntityFetch ): Observable => { const cleanEntityInfo$ = this.getCleanEntityInfoObs(entityMonitor); + return entityMonitor.entityRequest$.pipe( withLatestFrom(entityMonitor.entity$), tap(([entityRequestInfo, entity]) => { - if (actionDispatch && this.shouldCallAction(entityRequestInfo, entity)) { - actionDispatch(); + if (this.shouldCallAction(entityRequestInfo, entity)) { + actionDispatch(entity); } }), first(), @@ -163,9 +183,13 @@ export class EntityService { * @param updateKey - The store updating key for the poll */ poll(interval = 10000, updateKey = this.refreshKey) { - return this.entityMonitor.poll(interval, () => this.actionDispatch(updateKey), compose( - getUpdateSectionById(updateKey), - getEntityUpdateSections - )); + return this.entityMonitor.poll( + interval, + () => this.actionDispatch(updateKey, true)(null), + compose( + getUpdateSectionById(updateKey), + getEntityUpdateSections + ) + ); } } diff --git a/src/frontend/packages/store/src/helpers/store-helpers.ts b/src/frontend/packages/store/src/helpers/store-helpers.ts index eae4f97a71..15f69e72db 100644 --- a/src/frontend/packages/store/src/helpers/store-helpers.ts +++ b/src/frontend/packages/store/src/helpers/store-helpers.ts @@ -2,9 +2,11 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { IFavoritesInfo } from '../../../core/src/core/user-favorite-manager'; import { AppState } from '../app-state'; +import { MultiActionListEntity } from '../monitors/pagination-monitor'; import { errorFetchingFavoritesSelector, fetchingFavoritesSelector } from '../selectors/favorite-groups.selectors'; -import { IFavoritesInfo } from '../../../core/src/core/user-favorite-manager'; +import { APIResource } from '../types/api.types'; export function getDashboardStateSessionId(username?: string) { @@ -30,3 +32,10 @@ export function getFavoriteInfoObservable(store: Store): Observable { + if (entity instanceof MultiActionListEntity) { + return entity.entity.metadata ? entity.entity.metadata.guid : null; + } + return entity.metadata ? entity.metadata.guid : null; +}; diff --git a/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts b/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts index a3c18a2f81..c7a6dadd26 100644 --- a/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts +++ b/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts @@ -1,15 +1,17 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { AppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { EntityMonitor } from './entity-monitor'; -import { AppState } from '../app-state'; @Injectable() export class EntityMonitorFactory { - constructor(private store: Store) { } + constructor( + private store: Store, + ) { } private monitorCache: { [key: string]: EntityMonitor @@ -29,17 +31,15 @@ export class EntityMonitorFactory { if (!catalogEntity) { throw new Error(`Could not find catalog entity for endpoint type '${endpointType}' and entity type '${entityType}'`); } - const monitor = catalogEntity.getEntityMonitor( + const monitor = new EntityMonitor( this.store, id, - { - startWithNull, - schemaKey: entityConfig.schemaKey - } + catalogEntity.entityKey, + catalogEntity.getSchema(entityConfig.schemaKey), + startWithNull ); this.monitorCache[cacheKey] = monitor; return monitor; } } - } diff --git a/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts b/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts index 814898ba23..4b4fa9cddc 100644 --- a/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts +++ b/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '../app-state'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { PaginationMonitor } from './pagination-monitor'; diff --git a/src/frontend/packages/store/src/monitors/pagination-monitor.ts b/src/frontend/packages/store/src/monitors/pagination-monitor.ts index 3aded6a5a6..a55f2910dd 100644 --- a/src/frontend/packages/store/src/monitors/pagination-monitor.ts +++ b/src/frontend/packages/store/src/monitors/pagination-monitor.ts @@ -18,11 +18,12 @@ import { LocalPaginationHelpers, } from '../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; import { AppState, GeneralEntityAppState, GeneralRequestDataState } from '../app-state'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { EntitySchema } from '../helpers/entity-schema'; import { ActionState, ListActionState } from '../reducers/api-request-reducer/types'; +import { getCurrentPageRequestInfo } from '../reducers/pagination-reducer/pagination-reducer.types'; import { getAPIRequestDataState, selectEntities } from '../selectors/api.selectors'; import { selectPaginationState } from '../selectors/pagination.selectors'; import { PaginationEntityState } from '../types/pagination.types'; @@ -48,6 +49,7 @@ export class PaginationMonitor; + public currentPageState$: Observable; /** * Emits a boolean stating if the current page is fetching or not. */ @@ -121,19 +123,14 @@ export class PaginationMonitor this.getCurrentPageRequestInfo(pagination)) + ); } private createPaginationObservable( diff --git a/src/frontend/packages/store/src/public-api.ts b/src/frontend/packages/store/src/public-api.ts index 3977ce3af7..ac373eccf4 100644 --- a/src/frontend/packages/store/src/public-api.ts +++ b/src/frontend/packages/store/src/public-api.ts @@ -1,3 +1,6 @@ /* * Public API Surface of store */ + + // Helpers + export * from './helpers/store-helpers'; diff --git a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.spec.ts b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.spec.ts index f9d4b4f898..ac27583902 100644 --- a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.spec.ts +++ b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.spec.ts @@ -1,5 +1,3 @@ -import { domainEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; -import { IDomain } from '../../../../core/src/core/cf-api.types'; import { APIResource } from '../../types/api.types'; import { EntityRequestAction, ISuccessRequestAction } from '../../types/request.types'; import { requestDataReducerFactory } from './request-data-reducer.factory'; @@ -10,14 +8,13 @@ describe('RequestDataReducerFactory', () => { expect(reducer).toBeDefined(); }); it('should create with add new entity', () => { - const testEntityTypeUnused = 'test-unused'; - const entityKey = domainEntityType; + const entityKey = 'entityKey'; const guid = 'id123'; const successType = 'SUCCESS_YO'; const domain = { name: guid - } as IDomain; - const apiResource = { entity: domain, metadata: {} } as APIResource; + }; + const apiResource: APIResource<{ name: string }> = { entity: domain, metadata: { created_at: '', guid, updated_at: '', url: '' } }; const resEntity = { [guid]: apiResource }; diff --git a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts index 8947039baa..8797f5abfa 100644 --- a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts +++ b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts @@ -1,9 +1,9 @@ import { Action, ActionReducer } from '@ngrx/store'; +import { RECURSIVE_ENTITY_SET_DELETED, SetTreeDeleted } from '../../effects/recursive-entity-delete.effect'; import { InitCatalogEntitiesAction } from '../../entity-catalog.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { getDefaultStateFromEntityCatalog } from '../../entity-catalog/entity-catalog.store-setup'; -import { RECURSIVE_ENTITY_SET_DELETED, SetTreeDeleted } from '../../effects/recursive-entity-delete.effect'; import { deepMergeState } from '../../helpers/reducer.helper'; import { IFlatTree } from '../../helpers/schema-tree-traverse'; import { ISuccessRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts b/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts index 3f641545a1..ae52213fd9 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts @@ -1,9 +1,11 @@ import { Store } from '@ngrx/store'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; + import { pathGet } from '../../../../core/src/core/utils.service'; import { APIResponse } from '../../actions/request.actions'; import { BaseRequestState, GeneralAppState } from '../../app-state'; +import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { mergeState } from '../../helpers/reducer.helper'; import { NormalizedResponse } from '../../types/api.types'; import { PaginatedAction } from '../../types/pagination.types'; @@ -17,7 +19,6 @@ import { WrapperRequestActionSuccess, } from '../../types/request.types'; import { defaultDeletingActionState, getDefaultRequestState, RequestInfoState, rootUpdatingKey } from './types'; -import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; export function getEntityRequestState( state: BaseRequestState, diff --git a/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts b/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts index 418feaa0fe..71b79e9aaa 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts @@ -1,7 +1,7 @@ import { isNullOrUndefined } from 'util'; -import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; import { BaseRequestState } from '../../app-state'; +import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; import { mergeState } from '../../helpers/reducer.helper'; import { ISuccessRequestAction, WrapperRequestActionSuccess } from '../../types/request.types'; import { diff --git a/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts b/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts index f88d73d7ad..104e891ee5 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts @@ -1,13 +1,11 @@ import { Action } from '@ngrx/store'; -import { appStatsEntityType } from '../../../cloud-foundry/src/cf-entity-types'; + import { IRequestEntityTypeState } from '../app-state'; import { IRequestState } from '../types/entity.types'; import { requestReducerFactory } from './api-request-reducer/request-reducer.factory'; import { RequestInfoState } from './api-request-reducer/types'; import { chainApiReducers, ExtraApiReducers, requestActions } from './api-request-reducers.generator.helpers'; -import { appStatsReducer } from '../../../cloud-foundry/src/store/reducers/app-stats-request.reducer'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; + /** * This module uses the request data reducer and request reducer factories to create @@ -16,7 +14,7 @@ import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; const baseRequestReducer = requestReducerFactory(requestActions); const extraReducers = { - [entityCatalog.getEntityKey(CF_ENDPOINT_TYPE, appStatsEntityType)]: [appStatsReducer] + // ['entityKey']: [ reducer ] } as ExtraApiReducers>; const chainedReducers = chainApiReducers>(baseRequestReducer, extraReducers); diff --git a/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts b/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts index 0d999fb9f5..2a83934d21 100644 --- a/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts +++ b/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts @@ -10,7 +10,7 @@ import { import { AddRecentlyVisitedEntityAction, SetRecentlyVisitedEntityAction } from '../../actions/recently-visited.actions'; import { IRecentlyVisitedState } from '../../types/recently-visited.types'; import { addNewHit, cleanRecentsList, getDefaultRecentState } from './recently-visited.reducer.helpers'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; import { endpointSchemaKey } from '../../helpers/entity-factory'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts index f42251932a..8188fc3fff 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { ClearPaginationOfEntity } from '../../actions/pagination.actions'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; import { spreadClientPagination } from './pagination-reducer.helper'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts index 25cede1fdd..61cc841a8a 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts @@ -1,5 +1,5 @@ import { EndpointAction } from '../../actions/endpoint.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationState } from '../../types/pagination.types'; import { getDefaultPaginationEntityState } from './pagination-reducer-reset-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts index c97da32f57..d9c0465284 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { CreatePagination } from '../../actions/pagination.actions'; import { PaginationState } from '../../types/pagination.types'; import { createNewPaginationSection } from './pagination-reducer-create-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts index ef05eefaf2..7e57e52957 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../entity-catalog/entity-catalog.types'; import { CreatePagination } from '../../actions/pagination.actions'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts index b24dc25f4e..3d8080a705 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts @@ -2,7 +2,7 @@ import { LocalPaginationHelpers, } from '../../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; import { IgnorePaginationMaxedState, UpdatePaginationMaxedState } from '../../actions/pagination.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationEntityTypeState, PaginationState } from '../../types/pagination.types'; import { getDefaultPaginationEntityState } from './pagination-reducer-reset-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-remove-params.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-remove-params.ts index a4ef542716..4daaa07acb 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-remove-params.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-remove-params.ts @@ -1,4 +1,3 @@ -import { QParam } from '../../../../cloud-foundry/src/shared/q-param'; import { RemoveParams } from '../../actions/pagination.actions'; import { PaginationEntityState } from '../../types/pagination.types'; @@ -11,12 +10,6 @@ export function paginationRemoveParams(state: PaginationEntityState, action: Rem } }; - if (state.params.q) { - removeParamsState.params.q = (state.params.q as string[]).filter((qs: string) => { - return !action.qs.find((removeParamKey: string) => QParam.keyFromString(qs) === removeParamKey); - }); - } - action.params.forEach((key) => { if (removeParamsState.params.hasOwnProperty(key)) { delete removeParamsState.params[key]; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts index 1509f943c2..603b2b767f 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts @@ -1,5 +1,5 @@ import { ResetPagination } from '../../actions/pagination.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationEntityState, PaginationEntityTypeState, PaginationState } from '../../types/pagination.types'; export const defaultClientPaginationPageSize = 9; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts index 7cbe24d032..56a5e0bef4 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts @@ -1,9 +1,8 @@ -import { Action, Store } from '@ngrx/store'; +import { Store } from '@ngrx/store'; import { combineLatest, Observable } from 'rxjs'; import { distinctUntilChanged, filter, - first, map, pairwise, publishReplay, @@ -13,12 +12,10 @@ import { tap, } from 'rxjs/operators'; -import { populatePaginationFromParent } from '../../../../cloud-foundry/src/entity-relations/entity-relations'; import { sortStringify } from '../../../../core/src/core/utils.service'; import { SetInitialParams } from '../../actions/pagination.actions'; -import { CfValidateEntitiesStart } from '../../actions/request.actions'; import { AppState, GeneralEntityAppState } from '../../app-state'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationMonitor } from '../../monitors/pagination-monitor'; import { selectEntities } from '../../selectors/api.selectors'; import { selectPaginationState } from '../../selectors/pagination.selectors'; @@ -28,24 +25,7 @@ import { PaginationEntityState, PaginationParam, } from '../../types/pagination.types'; -import { ListActionState } from '../api-request-reducer/types'; - -export interface PaginationObservables { - pagination$: Observable; - entities$: Observable; - /** - * Convenience observable on !!entities - */ - hasEntities$: Observable; - /** - * Convenience observable on pagination totalResults (note - not entities.length. In maxed world this can be different) - */ - totalEntities$: Observable; - /** - * Equate to current page fetching observable - */ - fetchingEntities$: Observable; -} +import { getCurrentPageRequestInfo, PaginationObservables } from './pagination-reducer.types'; export function removeEmptyParams(params: PaginationParam) { const newObject = {}; @@ -60,7 +40,7 @@ export function removeEmptyParams(params: PaginationParam) { export function getActionType(action) { return action.type; } -// FIXME: Add typings, shouldbe done with #1477 +// FIXME: Add typings, should be done with #1477 export function getAction(action): PaginatedAction { if (!action) { return null; @@ -68,7 +48,7 @@ export function getAction(action): PaginatedAction { return action.apiAction ? action.apiAction : action; } -// FIXME: Add typings, shouldbe done with #1477 +// FIXME: Add typings, should be done with #1477 function getEntityConfigFromAction(action): PaginatedAction { if (action && action.entityConfig) { return action.entityConfig; @@ -76,7 +56,7 @@ function getEntityConfigFromAction(action): PaginatedAction { return getAction(action); } -// FIXME: Add typings, shouldbe done with #1477 +// FIXME: Add typings, should be done with #1477 export function getActionPaginationEntityKey(action): string { const apiAction = getAction(action); const entityConfig = apiAction.proxyPaginationEntityConfig || getEntityConfigFromAction(action); @@ -93,7 +73,7 @@ export const getPaginationObservables = { store, action, paginationMonitor }: { store: Store, action: PaginatedAction | PaginatedAction[], - paginationMonitor: PaginationMonitor + paginationMonitor: PaginationMonitor, }, isLocal = false ): PaginationObservables => { @@ -176,11 +156,8 @@ function shouldFetchNonLocalList(pagination: PaginationEntityState): boolean { return !hasError(pagination) && !hasValidOrGettingPage(pagination); } -function safePopulatePaginationFromParent(store: Store, action: PaginatedAction): Observable { - return populatePaginationFromParent(store, action).pipe( - map(newAction => newAction || action) - ); -} +const defaultEntitiesFetchHandler = (store: Store, actions: PaginatedAction[]) => () => + actions.forEach(action => store.dispatch(action)); function getObservables( store: Store, @@ -188,7 +165,7 @@ function getObservables( paginationKey: string, paginationAction: PaginatedAction | PaginatedAction[], paginationMonitor: PaginationMonitor, - isLocal = false + isLocal = false, ) : PaginationObservables { let hasDispatchedOnce = false; @@ -196,6 +173,12 @@ function getObservables( const paginationSelect$ = store.select(selectPaginationState(entityKey, paginationKey)); const pagination$: Observable = paginationSelect$.pipe(filter(pagination => !!pagination)); + const entity = entityCatalog.getEntity(arrayAction[0]); + const entitiesFetchHandler = entity.getEntitiesFetchHandler(); + const fetchHandler = entitiesFetchHandler ? + entitiesFetchHandler(store, arrayAction) : + defaultEntitiesFetchHandler(store, arrayAction); + // Keep this separate, we don't want tap executing every time someone subscribes const fetchPagination$ = paginationSelect$.pipe( startWith(null), @@ -203,38 +186,27 @@ function getObservables( tap(([prevPag, newPag]: [PaginationEntityState, PaginationEntityState]) => { if (shouldFetchLocalOrNonLocalList(isLocal, hasDispatchedOnce, newPag, prevPag)) { hasDispatchedOnce = true; // Ensure we set this first, otherwise we're called again instantly - combineLatest(arrayAction.map(action => safePopulatePaginationFromParent(store, action))).pipe( - first(), - ).subscribe(actions => actions.forEach(action => store.dispatch(action))); + fetchHandler(); } }), map(([, newPag]) => newPag) ); - let lastValidationFootprint: string; + const entitiesEmitHandlerBuilder = entity.getEntitiesEmitHandler(); + const actionEmitHandler = entitiesEmitHandlerBuilder ? entitiesEmitHandlerBuilder( + paginationAction, (action) => store.dispatch(action) + ) : () => { }; + const entities$: Observable = combineLatest( store.select(selectEntities(entityKey)), fetchPagination$, ) .pipe( - filter(([, pagination]) => { - return !!pagination && isPageReady(pagination, isLocal); - }), + filter(([, pagination]) => !!pagination && isPageReady(pagination, isLocal)), publishReplay(1), refCount(), - tap(([, pagination]) => { - const newValidationFootprint = getPaginationCompareString(pagination); - if (lastValidationFootprint !== newValidationFootprint) { - lastValidationFootprint = newValidationFootprint; - // FIXME: Move cf - #3675 - // This should use something similar to ENTITY_INFO_HANDLER or come from entity itself - arrayAction.forEach(action => store.dispatch(new CfValidateEntitiesStart( - action, - pagination.ids[action.__forcedPageNumber__ || pagination.currentPage] - ))); - } - }), + tap(([, pagination]) => actionEmitHandler(pagination)), switchMap(() => paginationMonitor.currentPage$), ); @@ -258,18 +230,6 @@ function getObservables( }; } -function getPaginationCompareString(paginationEntity: PaginationEntityState) { - if (!paginationEntity) { - return ''; - } - let params = ''; - if (paginationEntity.params) { - params = JSON.stringify(paginationEntity.params); - } - // paginationEntity.totalResults included to ensure we cover the 'ResetPagination' case, for instance after AddParam - return paginationEntity.totalResults + paginationEntity.currentPage + params + paginationEntity.pageCount; -} - export function isPageReady(pagination: PaginationEntityState, isLocal = false) { if (!pagination) { return false; @@ -306,14 +266,6 @@ export function hasError(pagination: PaginationEntityState): boolean { return pagination && getCurrentPageRequestInfo(pagination).error; } -export function getCurrentPageRequestInfo(pagination: PaginationEntityState, valueIfMissing = { - busy: false, - error: false, - message: '' -}): ListActionState { - return pagination.pageRequests[pagination.currentPage] || valueIfMissing; -} - export function spreadClientPagination(pag: PaginationClientPagination): PaginationClientPagination { return { ...pag, diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts index 4175f69173..bfaa0c3aeb 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts @@ -1,5 +1,39 @@ +import { Observable } from 'rxjs'; import { PaginationEntityState } from '../../types/pagination.types'; +import { ListActionState } from '../api-request-reducer/types'; export const resultPerPageParam = 'results-per-page'; export const resultPerPageParamDefault = 5; +export interface PaginationObservables { + pagination$: Observable; + entities$: Observable; + /** + * Convenience observable on !!entities + */ + hasEntities$: Observable; + /** + * Convenience observable on pagination totalResults (note - not entities.length. In maxed world this can be different) + */ + totalEntities$: Observable; + /** + * Equate to current page fetching observable + */ + fetchingEntities$: Observable; +} + +export function getCurrentPageRequestInfo(pagination: PaginationEntityState, valueIfMissing = { + busy: false, + error: false, + message: '' +}): ListActionState { + if ( + !pagination || + !pagination.pageRequests || + !pagination.pageRequests[pagination.currentPage] + ) { + return valueIfMissing; + } else { + return pagination.pageRequests[pagination.currentPage]; + } +} \ No newline at end of file diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.spec.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.spec.ts index ddf36ee94e..d3c48a2ad2 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.spec.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.spec.ts @@ -1,13 +1,13 @@ -import { CF_ENDPOINT_TYPE } from '../../../../cloud-foundry/src/cf-types'; -import { cfEntityFactory } from '../../../../cloud-foundry/src/cf-entity-factory'; -import { getCFEntityKey } from '../../../../cloud-foundry/src/cf-entity-helpers'; -import { CFEntitySchema } from '../../../../cloud-foundry/src/cf-entity-schema-types'; -import { applicationEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; +import { HttpRequest } from '@angular/common/http'; + +import { ENDPOINT_TYPE, endpointEntitySchema, STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; import { RequestTypes } from '../../actions/request.actions'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { EntityCatalogHelpers } from '../../entity-catalog/entity-catalog.helper'; +import { EntitySchema } from '../../helpers/entity-schema'; import { PaginatedAction } from '../../types/pagination.types'; import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess } from '../../types/request.types'; import { createPaginationReducer } from './pagination.reducer'; -import { HttpRequest } from '@angular/common/http'; function getReducer() { return createPaginationReducer([ @@ -20,9 +20,9 @@ function getReducer() { class MockPagAction implements PaginatedAction { actions = ['ONE', 'TWO', 'THREE']; options = new HttpRequest('GET', 'fake123'); - entity = cfEntityFactory(applicationEntityType); - entityType = applicationEntityType; - endpointType = CF_ENDPOINT_TYPE; + entity = endpointEntitySchema; + entityType = ENDPOINT_TYPE; + endpointType = STRATOS_ENDPOINT_TYPE; paginationKey = 'PaginationKey'; type = RequestTypes.START; } @@ -61,7 +61,7 @@ describe('PaginationReducer', () => { const apiAction = new MockPagAction(); apiAction.paginationKey = 'PaginationKey'; - const entityKey = getCFEntityKey(apiAction.entityType); + const entityKey = entityCatalog.getEntityKey(apiAction); const startApiAction = new StartRequestAction(apiAction, 'fetch'); const newState = paginationReducer( @@ -90,7 +90,7 @@ describe('PaginationReducer', () => { error: false, message: '', maxed: false, - baseEntityConfig: { entityType: applicationEntityType, endpointType: CF_ENDPOINT_TYPE, schemaKey: undefined }, + baseEntityConfig: { entityType: apiAction.entityType, endpointType: apiAction.endpointType, schemaKey: undefined }, entityConfig: null } }, @@ -112,8 +112,9 @@ describe('PaginationReducer', () => { const paginationReducer = getReducer(); + const endpointType = 'EndpointType' const entityType = 'EntityKey'; - const entityKey = getCFEntityKey(entityType); + const entityKey = EntityCatalogHelpers.buildEntityKey(entityType, endpointType); const paginationKey = 'PaginationKey'; const successApiAction = new WrapperRequestActionSuccess( @@ -125,11 +126,11 @@ describe('PaginationReducer', () => { ] }, { - endpointType: CF_ENDPOINT_TYPE, + endpointType, entityType, paginationKey, type: 'type', - entity: {} as CFEntitySchema, + entity: {} as EntitySchema, options: new HttpRequest('GET', 'fake'), actions: [] }, @@ -181,19 +182,20 @@ describe('PaginationReducer', () => { const paginationReducer = getReducer(); + const endpointType = 'EndpointType' const entityType = 'EntityKey'; - const entityKey = getCFEntityKey(entityType); + const entityKey = EntityCatalogHelpers.buildEntityKey(entityType, endpointType); const paginationKey = 'PaginationKey'; const message = 'Failed'; const failedApiAction = new WrapperRequestActionFailed( message, { - endpointType: CF_ENDPOINT_TYPE, + endpointType, entityType, paginationKey, type: 'type', - entity: {} as CFEntitySchema, + entity: {} as EntitySchema, actions: [] }, 'fetch' diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts index 0784503537..f39aa853f0 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts @@ -27,7 +27,7 @@ import { } from '../../actions/pagination.actions'; import { ApiActionTypes } from '../../actions/request.actions'; import { InitCatalogEntitiesAction } from '../../entity-catalog.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { getDefaultStateFromEntityCatalog } from '../../entity-catalog/entity-catalog.store-setup'; import { mergeState } from '../../helpers/reducer.helper'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; diff --git a/src/frontend/packages/store/src/reducers/routing.reducer.ts b/src/frontend/packages/store/src/reducers/routing.reducer.ts index d7556182b4..0434a9bf1c 100644 --- a/src/frontend/packages/store/src/reducers/routing.reducer.ts +++ b/src/frontend/packages/store/src/reducers/routing.reducer.ts @@ -1,5 +1,6 @@ -import { RoutingHistory, defaultRoutingState } from '../types/routing.type'; -import { RouterNavigationAction, ROUTER_NAVIGATION } from '@ngrx/router-store'; +import { ROUTER_NAVIGATION, RouterNavigationAction } from '@ngrx/router-store'; + +import { defaultRoutingState, RoutingHistory } from '../types/routing.type'; export interface RouterRedirect { path: string; @@ -20,11 +21,17 @@ export function routingReducer(state: RoutingHistory = defaultRoutingState, acti return state; } + // This changed in Angular 9 - state no longer embdedded + // This deduplicated the rotuerState + // We will keep it as before return { // ATM don't track change of route history // history: state.history.concat([action.payload.event]), previousState: state.currentState ? state.currentState : null, - currentState: action.payload.event + currentState: { + ...action.payload.event, + state: action.payload.routerState + } }; default: diff --git a/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts b/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts index 38ac1f8f07..5f52c49b13 100644 --- a/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts +++ b/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts @@ -6,8 +6,6 @@ import { CurrentUserRolesAppState } from '../app-state'; import { ICurrentUserRolesState, IStratosRolesState } from '../types/current-user-roles.types'; -type Omit = Pick>; - export const selectCurrentUserRolesState = (state: CurrentUserRolesAppState) => state.currentUserRoles; export const selectCurrentUserStratosRolesState = (state: ICurrentUserRolesState) => state.internal; diff --git a/src/frontend/packages/store/src/selectors/endpoint.selectors.ts b/src/frontend/packages/store/src/selectors/endpoint.selectors.ts index ee89fa29f4..0400350b59 100644 --- a/src/frontend/packages/store/src/selectors/endpoint.selectors.ts +++ b/src/frontend/packages/store/src/selectors/endpoint.selectors.ts @@ -31,7 +31,7 @@ export const endpointOfTypeSelector = (endpointType: string) => compose( ); // TODO: Move this #3769 -export const cfEndpointEntitiesSelector = endpointOfType('cf'); +const cfEndpointEntitiesSelector = endpointOfType('cf'); const getConnectedEndpoints = (endpoints: IRequestEntityTypeState) => Object.values(endpoints || {}).reduce((connected, endpoint) => { diff --git a/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts b/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts index f7100c7f94..a1b3158b2e 100644 --- a/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts +++ b/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts @@ -1,9 +1,9 @@ import { compose } from '@ngrx/store'; import { STRATOS_ENDPOINT_TYPE, userFavoritesEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { deriveEndpointFavoriteFromFavorite } from '../../../core/src/core/user-favorite-helpers'; -import { IRequestEntityTypeState, InternalAppState } from '../app-state'; +import { InternalAppState, IRequestEntityTypeState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { IUserFavoriteGroup, IUserFavoritesGroups, IUserFavoritesGroupsState } from '../types/favorite-groups.types'; import { IFavoriteMetadata, UserFavorite } from '../types/user-favorites.types'; diff --git a/src/frontend/packages/store/src/store.module.ts b/src/frontend/packages/store/src/store.module.ts index 6006f82e03..a29f7e5e41 100644 --- a/src/frontend/packages/store/src/store.module.ts +++ b/src/frontend/packages/store/src/store.module.ts @@ -4,7 +4,6 @@ import { EffectsModule } from '@ngrx/effects'; import { ActionHistoryEffect } from './effects/action-history.effects'; import { APIEffect } from './effects/api.effects'; -import { AppEffects } from './effects/app.effects'; import { AuthEffect } from './effects/auth.effects'; import { DashboardEffect } from './effects/dashboard.effects'; import { EndpointApiError } from './effects/endpoint-api-errors.effects'; @@ -12,13 +11,11 @@ import { EndpointsEffect } from './effects/endpoint.effects'; import { MetricsEffect } from './effects/metrics.effects'; import { PaginationEffects } from './effects/pagination.effects'; import { RecursiveDeleteEffect } from './effects/recursive-entity-delete.effect'; -import { CfValidateEffects } from './effects/request.effects'; import { RouterEffect } from './effects/router.effects'; import { SetClientFilterEffect } from './effects/set-client-filter.effect'; import { SnackBarEffects } from './effects/snackBar.effects'; import { SystemEffects } from './effects/system.effects'; import { UAASetupEffect } from './effects/uaa-setup.effects'; -import { UpdateAppEffects } from './effects/update-app-effects'; import { UserFavoritesEffect } from './effects/user-favorites-effect'; import { UserProfileEffect } from './effects/user-profile.effects'; import { UsersRolesEffects } from './effects/users-roles.effects'; @@ -40,7 +37,6 @@ import { AppReducersModule } from './reducers.module'; AuthEffect, UAASetupEffect, EndpointsEffect, - UpdateAppEffects, PaginationEffects, ActionHistoryEffect, RouterEffect, @@ -48,11 +44,9 @@ import { AppReducersModule } from './reducers.module'; SnackBarEffects, SetClientFilterEffect, MetricsEffect, - CfValidateEffects, UserProfileEffect, UsersRolesEffects, RecursiveDeleteEffect, - AppEffects, UserFavoritesEffect ]) ] diff --git a/src/frontend/packages/store/testing/src/store-test-helper.ts b/src/frontend/packages/store/testing/src/store-test-helper.ts index 8d4ce58cd0..9ad3e9ab30 100644 --- a/src/frontend/packages/store/testing/src/store-test-helper.ts +++ b/src/frontend/packages/store/testing/src/store-test-helper.ts @@ -4,7 +4,7 @@ import { Store, StoreModule } from '@ngrx/store'; import { endpointEntitySchema } from '../../../core/src/base-entity-schemas'; import { AppState } from '../../src/app-state'; -import { entityCatalog } from '../../src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../src/entity-catalog/entity-catalog.types'; import { appReducers } from '../../src/reducers.module'; import { getDefaultRequestState } from '../../src/reducers/api-request-reducer/types'; diff --git a/src/frontend/packages/store/testing/src/store-test.module.ts b/src/frontend/packages/store/testing/src/store-test.module.ts index a651b603fb..9bb257559b 100644 --- a/src/frontend/packages/store/testing/src/store-test.module.ts +++ b/src/frontend/packages/store/testing/src/store-test.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../src/entity-catalog/entity-catalog'; @NgModule({ imports: [ diff --git a/src/frontend/packages/store/tsconfig.lib.prod.json b/src/frontend/packages/store/tsconfig.lib.prod.json new file mode 100644 index 0000000000..b1d501abbc --- /dev/null +++ b/src/frontend/packages/store/tsconfig.lib.prod.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.lib.json", + "angularCompilerOptions": { + "enableIvy": false + } +} \ No newline at end of file diff --git a/src/jetstream/plugins/autoscaler/autoscaler.go b/src/jetstream/plugins/autoscaler/autoscaler.go index d0e99f20b1..d3fb26fdbf 100644 --- a/src/jetstream/plugins/autoscaler/autoscaler.go +++ b/src/jetstream/plugins/autoscaler/autoscaler.go @@ -87,3 +87,23 @@ func (a *Autoscaler) getAutoscalerEvent(echoContext echo.Context) error { } return a.portalProxy.SendProxiedResponse(echoContext, responses) } + +func (a *Autoscaler) createAutoscalerCredential(echoContext echo.Context) error { + appID := echoContext.Param("appId") + credentialURL, _ := url.Parse("/v1/apps/" + appID + "/credential") + responses, err := a.portalProxy.ProxyRequest(echoContext, credentialURL) + if err != nil { + return err + } + return a.portalProxy.SendProxiedResponse(echoContext, responses) +} + +func (a *Autoscaler) deleteAutoscalerCredential(echoContext echo.Context) error { + appID := echoContext.Param("appId") + credentialURL, _ := url.Parse("/v1/apps/" + appID + "/credential") + responses, err := a.portalProxy.ProxyRequest(echoContext, credentialURL) + if err != nil { + return err + } + return a.portalProxy.SendProxiedResponse(echoContext, responses) +} diff --git a/src/jetstream/plugins/autoscaler/main.go b/src/jetstream/plugins/autoscaler/main.go index ccfd9570d4..e33d092a0b 100644 --- a/src/jetstream/plugins/autoscaler/main.go +++ b/src/jetstream/plugins/autoscaler/main.go @@ -44,6 +44,8 @@ func (a *Autoscaler) AddSessionGroupRoutes(echoGroup *echo.Group) { echoGroup.GET("/autoscaler/apps/:appId/policy", a.getAutoscalerPolicy) echoGroup.PUT("/autoscaler/apps/:appId/policy", a.attachAutoscalerPolicy) echoGroup.DELETE("/autoscaler/apps/:appId/policy", a.detachAutoscalerPolicy) + echoGroup.PUT("/autoscaler/apps/:appId/credential", a.createAutoscalerCredential) + echoGroup.DELETE("/autoscaler/apps/:appId/credential", a.deleteAutoscalerCredential) echoGroup.GET("/autoscaler/apps/:appId/metric/:metricType", a.getAutoscalerMetric) echoGroup.GET("/autoscaler/apps/:appId/event", a.getAutoscalerEvent) } diff --git a/src/test-e2e/application/application-autoscaler-e2e.spec.ts b/src/test-e2e/application/application-autoscaler-e2e.spec.ts index 2ba7f2faf6..e4c148492f 100644 --- a/src/test-e2e/application/application-autoscaler-e2e.spec.ts +++ b/src/test-e2e/application/application-autoscaler-e2e.spec.ts @@ -88,7 +88,7 @@ describe('Autoscaler -', () => { }); it('Check edit steps', () => { - expect(createPolicy.header.getTitleText()).toBe('Create AutoScaler Policy: ' + testAppName); + createPolicy.header.waitForTitleText('Create AutoScaler Policy: ' + testAppName) // Check the steps e2e.debugLog(`${loggingPrefix} Checking Steps`); createPolicy.stepper.getStepNames().then(steps => { diff --git a/src/test-e2e/application/application-create-e2e.spec.ts b/src/test-e2e/application/application-create-e2e.spec.ts index 8b3fa56b78..a8dcab97b1 100644 --- a/src/test-e2e/application/application-create-e2e.spec.ts +++ b/src/test-e2e/application/application-create-e2e.spec.ts @@ -1,6 +1,6 @@ import { browser } from 'protractor'; -import { IApp } from '../../frontend/packages/core/src/core/cf-api.types'; +import { IApp } from '../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { ApplicationsPage } from '../applications/applications.po'; import { e2e } from '../e2e'; diff --git a/src/test-e2e/application/application-e2e-helpers.ts b/src/test-e2e/application/application-e2e-helpers.ts index 6927fff558..52646ae9b3 100644 --- a/src/test-e2e/application/application-e2e-helpers.ts +++ b/src/test-e2e/application/application-e2e-helpers.ts @@ -1,6 +1,6 @@ import { browser, promise } from 'protractor'; -import { IApp, IRoute, ISpace } from '../../frontend/packages/core/src/core/cf-api.types'; +import { IApp, IRoute, ISpace } from '../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { e2e, E2ESetup } from '../e2e'; import { E2EConfigCloudFoundry } from '../e2e.types'; diff --git a/src/test-e2e/application/application-routes-e2e.spec.ts b/src/test-e2e/application/application-routes-e2e.spec.ts index c3a0df34c4..6a0ee1ec60 100644 --- a/src/test-e2e/application/application-routes-e2e.spec.ts +++ b/src/test-e2e/application/application-routes-e2e.spec.ts @@ -1,6 +1,6 @@ import { browser, promise, protractor } from 'protractor'; -import { IApp } from '../../frontend/packages/core/src/core/cf-api.types'; +import { IApp } from '../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { e2e } from '../e2e'; import { CFHelpers } from '../helpers/cf-helpers'; diff --git a/src/test-e2e/application/application-view-e2e.spec.ts b/src/test-e2e/application/application-view-e2e.spec.ts index 92e241c8f2..e21593514e 100644 --- a/src/test-e2e/application/application-view-e2e.spec.ts +++ b/src/test-e2e/application/application-view-e2e.spec.ts @@ -1,6 +1,6 @@ import { protractor } from 'protractor'; -import { IApp } from '../../frontend/packages/core/src/core/cf-api.types'; +import { IApp } from '../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { ApplicationsPage } from '../applications/applications.po'; import { e2e } from '../e2e'; diff --git a/src/test-e2e/application/po/application-page.po.ts b/src/test-e2e/application/po/application-page.po.ts index d66ebd7f64..3fecf14176 100644 --- a/src/test-e2e/application/po/application-page.po.ts +++ b/src/test-e2e/application/po/application-page.po.ts @@ -65,7 +65,7 @@ export class ApplicationBasePage extends CFPage { } public waitForAutoscalerTab() { - return this.tabs.waitForItem('Autoscale'); + return this.tabs.waitForItem('Autoscale', 15000); } private goToTab(label: string, urlSuffix: string) { diff --git a/src/test-e2e/applications/application-wall-e2e.spec.ts b/src/test-e2e/applications/application-wall-e2e.spec.ts index e28265cf62..fc8f6d3da0 100644 --- a/src/test-e2e/applications/application-wall-e2e.spec.ts +++ b/src/test-e2e/applications/application-wall-e2e.spec.ts @@ -1,6 +1,6 @@ import { browser, promise } from 'protractor'; -import { IOrganization, ISpace } from '../../frontend/packages/core/src/core/cf-api.types'; +import { IOrganization, ISpace } from '../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { ApplicationE2eHelper } from '../application/application-e2e-helpers'; import { e2e } from '../e2e'; diff --git a/src/test-e2e/cloud-foundry/manage-users-stepper-e2e.spec.ts b/src/test-e2e/cloud-foundry/manage-users-stepper-e2e.spec.ts index d89dc3eb6b..75d391ab0c 100644 --- a/src/test-e2e/cloud-foundry/manage-users-stepper-e2e.spec.ts +++ b/src/test-e2e/cloud-foundry/manage-users-stepper-e2e.spec.ts @@ -71,7 +71,7 @@ describe('Manage Users Stepper', () => { const selectUser = new CheckboxComponent(usersTable.table.getCell(usersRow, 0)); selectUser.scrollIntoView(); selectUser.waitUntilShown(); - selectUser.getComponent().click(); + selectUser.click(); const usersButton = usersTable.header.getIconButton('people'); browser.wait(until.visibilityOf(usersButton)); diff --git a/src/test-e2e/cloud-foundry/org-level/org-spaces-e2e.spec.ts b/src/test-e2e/cloud-foundry/org-level/org-spaces-e2e.spec.ts index 379eb0c18d..1ddf2be05e 100644 --- a/src/test-e2e/cloud-foundry/org-level/org-spaces-e2e.spec.ts +++ b/src/test-e2e/cloud-foundry/org-level/org-spaces-e2e.spec.ts @@ -1,6 +1,6 @@ import { browser, promise } from 'protractor'; -import { IOrganization } from '../../../frontend/packages/core/src/core/cf-api.types'; +import { IOrganization } from '../../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../../frontend/packages/store/src/types/api.types'; import { e2e } from '../../e2e'; import { E2EConfigCloudFoundry } from '../../e2e.types'; diff --git a/src/test-e2e/cloud-foundry/space-level/space-routes-e2e.spec.ts b/src/test-e2e/cloud-foundry/space-level/space-routes-e2e.spec.ts index 40bba803d7..386a8bf593 100644 --- a/src/test-e2e/cloud-foundry/space-level/space-routes-e2e.spec.ts +++ b/src/test-e2e/cloud-foundry/space-level/space-routes-e2e.spec.ts @@ -1,6 +1,6 @@ import { browser, promise } from 'protractor'; -import { ISpace } from '../../../frontend/packages/core/src/core/cf-api.types'; +import { ISpace } from '../../../frontend/packages/cloud-foundry/src/cf-api.types'; import { APIResource } from '../../../frontend/packages/store/src/types/api.types'; import { e2e } from '../../e2e'; import { E2EConfigCloudFoundry } from '../../e2e.types'; diff --git a/src/test-e2e/e2e.ts b/src/test-e2e/e2e.ts index f5f8550002..49318abf03 100644 --- a/src/test-e2e/e2e.ts +++ b/src/test-e2e/e2e.ts @@ -204,6 +204,10 @@ export class E2ESetup { private doSetup() { const p = promise.fulfilled(true); + // Extend the timeout for setup + const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 120000; + // Create the sessions neeed if (this.needAdminSession) { p.then(() => this.createSession(this.adminReq, ConsoleUserType.admin)); @@ -217,6 +221,9 @@ export class E2ESetup { p.then(() => protractor.promise.controlFlow().execute(() => op.bind(this)())); }); + // Reset timeout + p.then(() => protractor.promise.controlFlow().execute(() => jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout)); + return promise; } diff --git a/src/test-e2e/helpers/cf-helpers.ts b/src/test-e2e/helpers/cf-helpers.ts index d22a87f612..e0df19f6f9 100644 --- a/src/test-e2e/helpers/cf-helpers.ts +++ b/src/test-e2e/helpers/cf-helpers.ts @@ -1,7 +1,5 @@ import { browser, promise } from 'protractor'; -import { CFResponse } from '../../frontend/packages/cloud-foundry/src/store/types/cf-api.types'; -import { CfUser } from '../../frontend/packages/cloud-foundry/src/store/types/user.types'; import { IApp, IDomain, @@ -10,7 +8,9 @@ import { IRoute, ISpace, ISpaceQuotaDefinition, -} from '../../frontend/packages/core/src/core/cf-api.types'; +} from '../../frontend/packages/cloud-foundry/src/cf-api.types'; +import { CFResponse } from '../../frontend/packages/cloud-foundry/src/store/types/cf-api.types'; +import { CfUser } from '../../frontend/packages/cloud-foundry/src/store/types/user.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { ApplicationPageSummaryTab } from '../application/po/application-page-summary.po'; import { CfTopLevelPage } from '../cloud-foundry/cf-level/cf-top-level-page.po'; @@ -54,8 +54,8 @@ export class CFHelpers { expect(users.length).toBeGreaterThanOrEqual(2, `Less than two users detected`); const testUser = this.findUser(users, endpoint.creds.nonAdmin.username); const testAdminUser = this.findUser(users, endpoint.creds.admin.username); - expect(testUser).toBeDefined(`Unable to find the non admin user '${endpoint.creds.nonAdmin.username}'`); - expect(testAdminUser).toBeDefined(`Unable to find the admin user '${endpoint.creds.admin.username}'`); + expect(testUser).toBeDefined('Could not find test user'); + expect(testAdminUser).toBeDefined('Could not find test admin user'); CFHelpers.cachedNonAdminGuid = testUser.metadata.guid; CFHelpers.cachedAdminGuid = testAdminUser.metadata.guid; }); diff --git a/src/test-e2e/helpers/request-helpers.ts b/src/test-e2e/helpers/request-helpers.ts index 8567263a7e..2d440ef58a 100644 --- a/src/test-e2e/helpers/request-helpers.ts +++ b/src/test-e2e/helpers/request-helpers.ts @@ -68,8 +68,6 @@ export class RequestHelpers { * @param {object?} formData - the form data */ sendRequest(req, options, body?: any, formData?): promise.Promise { - - const p = promise.defer(); const reqObj = req || this.newRequest(); options.url = this.getHost() + '/' + options.url; @@ -85,26 +83,55 @@ export class RequestHelpers { } E2E.debugLog('REQ: ' + options.method + ' ' + options.url); - E2E.debugLog(' > ' + JSON.stringify(options)); + this.showOptions(options); + return this.retryRequest(reqObj, options, body, formData); + } - reqObj(options).then((response) => { - E2E.debugLog('OK'); + retryRequest(reqObj, options, body?: any, formData?, promize = null, retry = 0): promise.Promise { + const _that = this; + const p = promize || promise.defer(); + reqObj(options).then((response) => { + E2E.debugLog(' + OK : ' + response.statusCode); // Get XSRF Token if (response.headers && response.headers['x-xsrf-token']) { reqObj._xsrfToken = response.headers['x-xsrf-token']; } p.fulfill(response.body); }).catch((e) => { - E2E.debugLog('ERROR'); - E2E.debugLog(e); - E2E.debugLog(e.statusCode + ' : ' + e.message); - p.reject(e); + E2E.debugLog(' - ERR: ' + e.statusCode + ' : ' + e.message); + if (e.statusCode !== 401 && retry < 2) { + retry++; + E2E.debugLog(' - Retrying ' + options.method + ' ' + options.url + ' [' + retry + ']'); + _that.retryRequest(reqObj, options, body, formData, p, retry); + } else { + p.reject(e); + } }); return p.promise; } + showOptions(options: any) { + if (!options) { + return; + } + const cpy = JSON.parse(JSON.stringify(options)); + this.sanitizeOption(cpy); + E2E.debugLog(' > ' + JSON.stringify(cpy)); + } + + sanitizeOption(options) { + Object.keys(options).forEach(key => { + const v = options[key]; + if (typeof v === 'string' && key === 'password') { + options[key]='******'; + } else if (typeof v === 'object') { + this.sanitizeOption(options[key]); + } + }); + } + /** * @createSession * @description Create a session @@ -116,6 +143,7 @@ export class RequestHelpers { username: creds.username || 'dev', password: creds.password || 'dev' }; + return this.sendRequest(req, { method: 'POST', url: 'pp/v1/auth/login/uaa' }, null, formData); } diff --git a/src/test-e2e/marketplace/services-helper-e2e.ts b/src/test-e2e/marketplace/services-helper-e2e.ts index ae923cab80..7e358eb5f8 100644 --- a/src/test-e2e/marketplace/services-helper-e2e.ts +++ b/src/test-e2e/marketplace/services-helper-e2e.ts @@ -1,7 +1,7 @@ import { browser, promise, protractor } from 'protractor'; +import { IServiceInstance } from '../../frontend/packages/cloud-foundry/src/cf-api-svc.types'; import { CFResponse, createEmptyCfResponse } from '../../frontend/packages/cloud-foundry/src/store/types/cf-api.types'; -import { IServiceInstance } from '../../frontend/packages/core/src/core/cf-api-svc.types'; import { APIResource } from '../../frontend/packages/store/src/types/api.types'; import { e2e, E2ESetup } from '../e2e'; import { CFHelpers } from '../helpers/cf-helpers'; diff --git a/src/test-e2e/po/checkbox.po.ts b/src/test-e2e/po/checkbox.po.ts index 4838289ddc..efb3015053 100644 --- a/src/test-e2e/po/checkbox.po.ts +++ b/src/test-e2e/po/checkbox.po.ts @@ -1,4 +1,4 @@ -import { promise, by, ElementFinder, element } from 'protractor'; +import { by, element, ElementFinder, promise } from 'protractor'; import { Component } from './component.po'; @@ -15,4 +15,8 @@ export class CheckboxComponent extends Component { isDisabled(): promise.Promise { return this.locator.element(by.css(`input`)).isEnabled().then(enabled => !enabled); } + + click(): promise.Promise { + return this.getComponent().element(by.css('.mat-checkbox-inner-container')).click(); + } } diff --git a/src/test-e2e/po/component.po.ts b/src/test-e2e/po/component.po.ts index 7ed4f5b704..fac898cb23 100644 --- a/src/test-e2e/po/component.po.ts +++ b/src/test-e2e/po/component.po.ts @@ -1,4 +1,4 @@ -import { browser, promise } from 'protractor'; +import { browser, promise, ElementArrayFinder, Locator } from 'protractor'; import { ElementFinder, protractor } from 'protractor/built'; import { E2EHelpers } from '../helpers/e2e-helpers'; @@ -10,8 +10,14 @@ const until = protractor.ExpectedConditions; */ export class Component { + public static waitUntilShown(elm, failMsg?: string): promise.Promise { + const comp = new Component(elm); + return comp.waitUntilShown(failMsg); + } + public static waitUntilNotShown(elm, failMsg?: string): promise.Promise { - return browser.wait(until.invisibilityOf(elm), 5000, failMsg); + const comp = new Component(elm); + return comp.waitUntilNotShown(failMsg); } public static scrollIntoView(elm: ElementFinder): promise.Promise { @@ -20,6 +26,10 @@ export class Component { constructor(protected locator: ElementFinder) { } + all(allLocator: Locator): ElementArrayFinder { + return this.locator.all(allLocator); + } + getComponent(): ElementFinder { return this.locator; } diff --git a/src/test-e2e/po/form.po.ts b/src/test-e2e/po/form.po.ts index c8fa98f619..4ba0f71622 100644 --- a/src/test-e2e/po/form.po.ts +++ b/src/test-e2e/po/form.po.ts @@ -1,8 +1,10 @@ +import { e2e } from './../e2e'; import { browser, by, element, promise } from 'protractor'; import { ElementArrayFinder, ElementFinder, protractor } from 'protractor/built'; import { Key } from 'selenium-webdriver'; import { Component } from './component.po'; +import { P } from '@angular/cdk/keycodes'; const until = protractor.ExpectedConditions; @@ -20,9 +22,9 @@ export interface FormItem { checked: boolean; type: string; class: string; - sendKeys: Function; - clear: Function; - click: Function; + sendKeys: (text) => void; + clear: () => void; + click: () => void; tag: string; valid: string; error: string; @@ -136,6 +138,15 @@ export class FormComponent extends Component { }; } + quickMapField(elm: ElementFinder, index: number): FormItem | any { + return { + index, + name: elm.getAttribute('name'), + text: elm.getText(), + click: elm.click, + }; + } + // Get the form field with the specified name or formcontrolname getField(ctrlName: string): ElementFinder { const fields = this.getFields(); @@ -259,6 +270,13 @@ export class FormComponent extends Component { ctrl.sendKeys(Key.ESCAPE); break; } + + // Options are presented in a .mat-select-panel + // Open the selector + ctrl.click(); + const selectMenu = new Component(element(by.css('.mat-select-panel'))); + selectMenu.waitUntilShown(); + // Filter down so that the item we want appears in the list let strValue = value as string; // Handle spaces in text. (sendKeys sends space bar.. which closes drop down) // Bonus - Sending string without space works... up until last character...which deselects desired option and selects top option @@ -266,11 +284,17 @@ export class FormComponent extends Component { if (containsSpace >= 0) { strValue = strValue.slice(0, containsSpace); } - ctrl.click(); ctrl.sendKeys(strValue); - ctrl.sendKeys(Key.RETURN); + selectMenu.all(by.tagName('mat-option')).map(this.quickMapField).then(options => { + const opt: any = options.find((option: FormItem) => option.text === value); + if (opt) { + opt.click(); + selectMenu.waitUntilNotShown(); + } + }); + if (!expectFailure) { - expect(this.getText(field)).toBe(value, `Failed to set field '${field}' with '${strValue}'`); + expect(this.getText(field)).toBe(value, `Failed to set field '${field}' with '${value}'`); } else { expect(this.getText(field)).not.toBe(value); } diff --git a/src/test-e2e/po/page-tabs.po.ts b/src/test-e2e/po/page-tabs.po.ts index aaad18682b..9742f153e0 100644 --- a/src/test-e2e/po/page-tabs.po.ts +++ b/src/test-e2e/po/page-tabs.po.ts @@ -11,7 +11,7 @@ export class MenuItem { index: number; label: string; class: string; - click: Function; + click: () => {}; disabled: boolean; } @@ -46,9 +46,9 @@ export class PageTabsPo extends Component { return this.getItem(name).click(); } - waitForItem(name: string): promise.Promise { + waitForItem(name: string, waitDuration?: number): promise.Promise { const item = new Component(this.getItem(name)); - return item.waitUntilShown(); + return item.waitUntilShown(`Waiting for tab: ${name} to be shown`, waitDuration); } goToItemAndWait(name: string, baseUrl: string, suffix: string): promise.Promise { diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index b757b63ed4..4b6895009b 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -8,4 +8,4 @@ "node" ] }, -} \ No newline at end of file +}